LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDE2IEZ1bmRhY2nzbiBUZWNuYWxpYSBSZXNlYXJjaCAmIElubm92YXRpb24uCiAqCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICBIdWFzY2FyIEVzcGlub3phIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgQWxlamFuZHJhIFJ17XogLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgTWFyaSBDYXJtZW4gUGFsYWNpb3MgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBBbmdlbCBM83BleiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogCiAqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5iYXNlbGluZS5iYXNlbGluZS5kaWFncmFtLnByb3ZpZGVyczsKCmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7CmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5tb2RlbGluZ2Fzc2lzdGFudC5Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZzsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5iYXNlbGluZS5iYXNlbGluZS5kaWFncmFtLnBhcnQuQmFzZWxpbmVEaWFncmFtRWRpdG9yUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmJhc2VsaW5lLmJhc2VsaW5lLmRpYWdyYW0ucGFydC5NZXNzYWdlczsKCi8qKgogKiBAZ2VuZXJhdGVkCiAqLwpwdWJsaWMgY2xhc3MgQmFzZWxpbmVNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIGV4dGVuZHMKCQlNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIHsKCgkvKioKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHVibGljIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50Rm9yU291cmNlKElBZGFwdGFibGUgdGFyZ2V0LAoJCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewoJCXJldHVybiBzZWxlY3RFeGlzdGluZ0VsZW1lbnQodGFyZ2V0LAoJCQkJZ2V0VHlwZXNGb3JTb3VyY2UodGFyZ2V0LCByZWxhdGlvbnNoaXBUeXBlKSk7Cgl9CgoJLyoqCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXB1YmxpYyBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudEZvclRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwKCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKCQlyZXR1cm4gc2VsZWN0RXhpc3RpbmdFbGVtZW50KHNvdXJjZSwKCQkJCWdldFR5cGVzRm9yVGFyZ2V0KHNvdXJjZSwgcmVsYXRpb25zaGlwVHlwZSkpOwoJfQoKCS8qKgoJICogQGdlbmVyYXRlZAoJICovCglwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnQoSUFkYXB0YWJsZSBob3N0LCBDb2xsZWN0aW9uIHR5cGVzKSB7CgkJaWYgKHR5cGVzLmlzRW1wdHkoKSkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgkJSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgaG9zdAoJCQkJLmdldEFkYXB0ZXIoSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKCQlpZiAoZWRpdFBhcnQgPT0gbnVsbCkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldFJvb3QoKS5nZXRDb250ZW50cygpLmdldE1vZGVsKCk7CgkJSGFzaFNldDxFT2JqZWN0PiBlbGVtZW50cyA9IG5ldyBIYXNoU2V0PEVPYmplY3Q+KCk7CgkJZm9yIChJdGVyYXRvcjxFT2JqZWN0PiBpdCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpLmVBbGxDb250ZW50cygpOyBpdAoJCQkJLmhhc05leHQoKTspIHsKCQkJRU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOwoJCQlpZiAoaXNBcHBsaWNhYmxlRWxlbWVudChlbGVtZW50LCB0eXBlcykpIHsKCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKCQkJfQoJCX0KCQlpZiAoZWxlbWVudHMuaXNFbXB0eSgpKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCQlyZXR1cm4gc2VsZWN0RWxlbWVudCgoRU9iamVjdFtdKSBlbGVtZW50cy50b0FycmF5KG5ldyBFT2JqZWN0W2VsZW1lbnRzCgkJCQkuc2l6ZSgpXSkpOwoJfQoKCS8qKgoJICogQGdlbmVyYXRlZAoJICovCglwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2FibGVFbGVtZW50KEVPYmplY3QgZWxlbWVudCwgQ29sbGVjdGlvbiB0eXBlcykgewoJCUlFbGVtZW50VHlwZSB0eXBlID0gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRUeXBlKAoJCQkJZWxlbWVudCk7CgkJcmV0dXJuIHR5cGVzLmNvbnRhaW5zKHR5cGUpOwoJfQoKCS8qKgoJICogQGdlbmVyYXRlZAoJICovCglwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RFbGVtZW50KEVPYmplY3RbXSBlbGVtZW50cykgewoJCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKCQkJCUJhc2VsaW5lRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCgkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSk7CgkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKAoJCQkJc2hlbGwsIGxhYmVsUHJvdmlkZXIpOwoJCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLkJhc2VsaW5lTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlck1lc3NhZ2UpOwoJCWRpYWxvZy5zZXRUaXRsZShNZXNzYWdlcy5CYXNlbGluZU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXJUaXRsZSk7CgkJZGlhbG9nLnNldE11bHRpcGxlU2VsZWN0aW9uKGZhbHNlKTsKCQlkaWFsb2cuc2V0RWxlbWVudHMoZWxlbWVudHMpOwoJCUVPYmplY3Qgc2VsZWN0ZWQgPSBudWxsOwoJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewoJCQlzZWxlY3RlZCA9IChFT2JqZWN0KSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKCQl9CgkJcmV0dXJuIHNlbGVjdGVkOwoJfQoKfQo=