LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDE2IEZ1bmRhY2nzbiBUZWNuYWxpYSBSZXNlYXJjaCAmIElubm92YXRpb24uCiAqCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICBIdWFzY2FyIEVzcGlub3phIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgQWxlamFuZHJhIFJ17XogLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgTWFyaSBDYXJtZW4gUGFsYWNpb3MgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBBbmdlbCBM83BleiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogCiAqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5iYXNlbGluZS5iYXNlbGluZS5kaWFncmFtLmVkaXQuY29tbWFuZHM7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsKaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYmFzZWxpbmUuYmFzZWxpbmUuQmFzZUFjdGl2aXR5OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmJhc2VsaW5lLmJhc2VsaW5lLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5CYXNlbGluZUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5OwoKLyoqCiAqIEBnZW5lcmF0ZWQKICovCnB1YmxpYyBjbGFzcyBCYXNlQWN0aXZpdHlQcmVjZWRpbmdBY3Rpdml0eVJlb3JpZW50Q29tbWFuZCBleHRlbmRzCgkJRWRpdEVsZW1lbnRDb21tYW5kIHsKCgkvKioKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHJpdmF0ZSBmaW5hbCBpbnQgcmVvcmllbnREaXJlY3Rpb247CgoJLyoqCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXByaXZhdGUgZmluYWwgRU9iamVjdCByZWZlcmVuY2VPd25lcjsKCgkvKioKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG9sZEVuZDsKCgkvKioKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG5ld0VuZDsKCgkvKioKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHVibGljIEJhc2VBY3Rpdml0eVByZWNlZGluZ0FjdGl2aXR5UmVvcmllbnRDb21tYW5kKAoJCQlSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxdWVzdCkgewoJCXN1cGVyKHJlcXVlc3QuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxdWVzdCk7CgkJcmVvcmllbnREaXJlY3Rpb24gPSByZXF1ZXN0LmdldERpcmVjdGlvbigpOwoJCXJlZmVyZW5jZU93bmVyID0gcmVxdWVzdC5nZXRSZWZlcmVuY2VPd25lcigpOwoJCW9sZEVuZCA9IHJlcXVlc3QuZ2V0T2xkUmVsYXRpb25zaGlwRW5kKCk7CgkJbmV3RW5kID0gcmVxdWVzdC5nZXROZXdSZWxhdGlvbnNoaXBFbmQoKTsKCX0KCgkvKioKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKCQlpZiAoZmFsc2UgPT0gcmVmZXJlbmNlT3duZXIgaW5zdGFuY2VvZiBCYXNlQWN0aXZpdHkpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1NPVVJDRSkgewoJCQlyZXR1cm4gY2FuUmVvcmllbnRTb3VyY2UoKTsKCQl9CgkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9UQVJHRVQpIHsKCQkJcmV0dXJuIGNhblJlb3JpZW50VGFyZ2V0KCk7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVvcmllbnRTb3VyY2UoKSB7CgkJaWYgKCEob2xkRW5kIGluc3RhbmNlb2YgQmFzZUFjdGl2aXR5ICYmIG5ld0VuZCBpbnN0YW5jZW9mIEJhc2VBY3Rpdml0eSkpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gQmFzZWxpbmVCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5nZXRMaW5rQ29uc3RyYWludHMoKQoJCQkJLmNhbkV4aXN0QmFzZUFjdGl2aXR5UHJlY2VkaW5nQWN0aXZpdHlfNDAwMyhnZXROZXdTb3VyY2UoKSwKCQkJCQkJZ2V0T2xkVGFyZ2V0KCkpOwoJfQoKCS8qKgoJICogQGdlbmVyYXRlZAoJICovCglwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW9yaWVudFRhcmdldCgpIHsKCQlpZiAoIShvbGRFbmQgaW5zdGFuY2VvZiBCYXNlQWN0aXZpdHkgJiYgbmV3RW5kIGluc3RhbmNlb2YgQmFzZUFjdGl2aXR5KSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiBCYXNlbGluZUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmdldExpbmtDb25zdHJhaW50cygpCgkJCQkuY2FuRXhpc3RCYXNlQWN0aXZpdHlQcmVjZWRpbmdBY3Rpdml0eV80MDAzKGdldE9sZFNvdXJjZSgpLAoJCQkJCQlnZXROZXdUYXJnZXQoKSk7Cgl9CgoJLyoqCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAoJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewoJCWlmICghY2FuRXhlY3V0ZSgpKSB7CgkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oCgkJCQkJIkludmFsaWQgYXJndW1lbnRzIGluIHJlb3JpZW50IGxpbmsgY29tbWFuZCIpOyAvLyROT04tTkxTLTEkCgkJfQoJCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfU09VUkNFKSB7CgkJCXJldHVybiByZW9yaWVudFNvdXJjZSgpOwoJCX0KCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1RBUkdFVCkgewoJCQlyZXR1cm4gcmVvcmllbnRUYXJnZXQoKTsKCQl9CgkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwoJfQoKCS8qKgoJICogQGdlbmVyYXRlZAoJICovCglwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCByZW9yaWVudFNvdXJjZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewoJCWdldE9sZFNvdXJjZSgpLmdldFByZWNlZGluZ0FjdGl2aXR5KCkucmVtb3ZlKGdldE9sZFRhcmdldCgpKTsKCQlnZXROZXdTb3VyY2UoKS5nZXRQcmVjZWRpbmdBY3Rpdml0eSgpLmFkZChnZXRPbGRUYXJnZXQoKSk7CgkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KHJlZmVyZW5jZU93bmVyKTsKCX0KCgkvKioKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgcmVvcmllbnRUYXJnZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKCQlnZXRPbGRTb3VyY2UoKS5nZXRQcmVjZWRpbmdBY3Rpdml0eSgpLnJlbW92ZShnZXRPbGRUYXJnZXQoKSk7CgkJZ2V0T2xkU291cmNlKCkuZ2V0UHJlY2VkaW5nQWN0aXZpdHkoKS5hZGQoZ2V0TmV3VGFyZ2V0KCkpOwoJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChyZWZlcmVuY2VPd25lcik7Cgl9CgoJLyoqCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXByb3RlY3RlZCBCYXNlQWN0aXZpdHkgZ2V0T2xkU291cmNlKCkgewoJCXJldHVybiAoQmFzZUFjdGl2aXR5KSByZWZlcmVuY2VPd25lcjsKCX0KCgkvKioKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHJvdGVjdGVkIEJhc2VBY3Rpdml0eSBnZXROZXdTb3VyY2UoKSB7CgkJcmV0dXJuIChCYXNlQWN0aXZpdHkpIG5ld0VuZDsKCX0KCgkvKioKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHJvdGVjdGVkIEJhc2VBY3Rpdml0eSBnZXRPbGRUYXJnZXQoKSB7CgkJcmV0dXJuIChCYXNlQWN0aXZpdHkpIG9sZEVuZDsKCX0KCgkvKioKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHJvdGVjdGVkIEJhc2VBY3Rpdml0eSBnZXROZXdUYXJnZXQoKSB7CgkJcmV0dXJuIChCYXNlQWN0aXZpdHkpIG5ld0VuZDsKCX0KfQo=