LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuSU1pbWVNYXBwaW5nOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuWE1MVXRpbDsKaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwppbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CmltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwovKioKICogSGVscGVyIGNsYXNzIHRvIGFjY2VzcyBhIHdlYi54bWwgZmlsZS4KICovCnB1YmxpYyBjbGFzcyBXZWJBcHBEb2N1bWVudCB7Cglwcm90ZWN0ZWQgYm9vbGVhbiBpc1dlYkFwcERpcnR5OwoJcHJvdGVjdGVkIERvY3VtZW50IHdlYkFwcERvY3VtZW50OwoKCS8qKgoJICogTG9hZHMgYSB3ZWIueG1sIGZyb20gdGhlIGdpdmVuIFVSTC4KCSAqCgkgKiBAcGFyYW0gdXJsIGphdmEubmV0LlVSTAoJICovCglwdWJsaWMgV2ViQXBwRG9jdW1lbnQoSVBhdGggcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJd2ViQXBwRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgudG9GaWxlKCkpKSk7Cgl9CgoJLyoqCgkgKiBMb2FkcyBhIHdlYi54bWwgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UuCgkgKgoJICogQHBhcmFtIHJlc291cmNlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZQoJICovCglwdWJsaWMgV2ViQXBwRG9jdW1lbnQoSUZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJd2ViQXBwRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShmaWxlLmdldENvbnRlbnRzKCkpKTsKCX0KCgkvKioKCSAqIEFkZHMgYSBNaW1lTWFwcGluZy4KCSAqCgkgKiBAcGFyYW0gaW5kZXggaW50CgkgKiBAcGFyYW0gbWFwIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0Lk1pbWVNYXBwaW5nCgkgKi8KCXB1YmxpYyB2b2lkIGFkZE1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewoJCVRyYWNlLnRyYWNlKCJBZGRpbmcgbWltZSBtYXBwaW5nICIgKyBpbmRleCArICIgIiArIG1hcC5nZXRNaW1lVHlwZSgpICsgIiAiICsgbWFwLmdldEV4dGVuc2lvbigpKTsKCQlFbGVtZW50IGVsZW1lbnQgPSB3ZWJBcHBEb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKCQlFbGVtZW50IG1hcHBpbmcgPSBYTUxVdGlsLmNyZWF0ZUNoaWxkRWxlbWVudCh3ZWJBcHBEb2N1bWVudCwgZWxlbWVudCwgaW5kZXgsICJtaW1lLW1hcHBpbmciKTsKCQlYTUxVdGlsLmluc2VydFRleHQod2ViQXBwRG9jdW1lbnQsIG1hcHBpbmcsICJcblx0Iik7CgkJWE1MVXRpbC5jcmVhdGVUZXh0Q2hpbGRFbGVtZW50KHdlYkFwcERvY3VtZW50LCBtYXBwaW5nLCAiZXh0ZW5zaW9uIiwgbWFwLmdldEV4dGVuc2lvbigpKTsKCQlYTUxVdGlsLmluc2VydFRleHQod2ViQXBwRG9jdW1lbnQsIG1hcHBpbmcsICJcblx0Iik7CgkJWE1MVXRpbC5jcmVhdGVUZXh0Q2hpbGRFbGVtZW50KHdlYkFwcERvY3VtZW50LCBtYXBwaW5nLCAibWltZS10eXBlIiwgbWFwLmdldE1pbWVUeXBlKCkpOwoJCVhNTFV0aWwuaW5zZXJ0VGV4dCh3ZWJBcHBEb2N1bWVudCwgbWFwcGluZywgIlxuIik7CgkKCQlpc1dlYkFwcERpcnR5ID0gdHJ1ZTsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBsaXN0IG9mIE1pbWVNYXBwaW5ncy4KCSAqCgkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0CgkgKi8KCXB1YmxpYyBMaXN0IGdldE1pbWVNYXBwaW5ncygpIHsKCQlMaXN0IG1hcCA9IG5ldyBBcnJheUxpc3QoKTsKCQoJCUVsZW1lbnQgcm9vdCA9IHdlYkFwcERvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwoJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gWE1MVXRpbC5nZXROb2RlSXRlcmF0b3Iocm9vdCwgIm1pbWUtbWFwcGluZyIpOwoJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKCQkJU3RyaW5nIG1pbWVUeXBlID0gWE1MVXRpbC5nZXRTdWJOb2RlVmFsdWUoZWxlbWVudCwgIm1pbWUtdHlwZSIpOwoJCQlTdHJpbmcgZXh0ZW5zaW9uID0gWE1MVXRpbC5nZXRTdWJOb2RlVmFsdWUoZWxlbWVudCwgImV4dGVuc2lvbiIpOwoJCQlNaW1lTWFwcGluZyBtbSA9IG5ldyBNaW1lTWFwcGluZyhleHRlbnNpb24sIG1pbWVUeXBlKTsKCQkJbWFwLmFkZChtbSk7CgkJfQoJCgkJcmV0dXJuIG1hcDsKCX0KCgkvKioKCSAqIE1vZGlmaWVzIGEgbWltZSBtYXBwaW5nLgoJICoKCSAqIEBwYXJhbSBpbmRleCBpbnQKCSAqIEBwYXJhbSBtYXBwaW5nIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0Lk1pbWVNYXBwaW5nCgkgKi8KCXB1YmxpYyB2b2lkIG1vZGlmeU1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewoJCUVsZW1lbnQgZWxlbWVudCA9IHdlYkFwcERvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwoJCU5vZGVMaXN0IGxpc3QgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtaW1lLW1hcHBpbmciKTsKCQlFbGVtZW50IGVsZW1lbnQyID0gKEVsZW1lbnQpIGxpc3QuaXRlbShpbmRleCk7CgkJWE1MVXRpbC5zZXROb2RlVmFsdWUoZWxlbWVudDIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImV4dGVuc2lvbiIpLml0ZW0oMCksICJleHRlbnNpb24iLCBtYXAuZ2V0RXh0ZW5zaW9uKCkpOwoJCVhNTFV0aWwuc2V0Tm9kZVZhbHVlKGVsZW1lbnQyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtaW1lLXR5cGUiKS5pdGVtKDApLCAibWltZS10eXBlIiwgbWFwLmdldE1pbWVUeXBlKCkpOwoJCQkKCQlpc1dlYkFwcERpcnR5ID0gdHJ1ZTsKCX0KCgkvKioKCSAqIFJlbW92ZXMgdGhlIG1pbWUgbWFwcGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgoJICoKCSAqIEBwYXJhbSBpbmRleCBpbnQKCSAqLwoJcHVibGljIHZvaWQgcmVtb3ZlTWltZU1hcHBpbmcoaW50IGluZGV4KSB7CgkJRWxlbWVudCBlbGVtZW50ID0gd2ViQXBwRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CgkJTm9kZUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1pbWUtbWFwcGluZyIpOwoJCU5vZGUgbm9kZSA9IGxpc3QuaXRlbShpbmRleCk7CgkJZWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTsKCQlpc1dlYkFwcERpcnR5ID0gdHJ1ZTsKCX0KCQoJLyoqCgkgKiBTYXZlcyB0aGUgV2ViIGFwcCBkb2N1bWVudC4KCSAqCgkgKiBAcGFyYW0gZmlsZW5hbWUgamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgdm9pZCBzYXZlKFN0cmluZyBwYXRoLCBib29sZWFuIGZvcmNlRGlydHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgkJaWYgKGZvcmNlRGlydHkgfHwgaXNXZWJBcHBEaXJ0eSkKCQkJWE1MVXRpbC5zYXZlKHBhdGgsIHdlYkFwcERvY3VtZW50KTsKCX0KCQoJLyoqCgkgKiBTYXZlcyB0aGUgV2ViIGFwcCBkb2N1bWVudC4KCSAqCgkgKiBAcGFyYW0gZmlsZW5hbWUgamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgdm9pZCBzYXZlKElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJYnl0ZVtdIGRhdGEgPSBYTUxVdGlsLmdldENvbnRlbnRzKHdlYkFwcERvY3VtZW50KTsKCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7CgkJdHJ5IHsKCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7CgkJCWlmIChmaWxlLmV4aXN0cygpKQoJCQkJZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7CgkJCWVsc2UKCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkvLyBpZ25vcmUKCQl9IGZpbmFsbHkgewoJCQl0cnkgewoJCQkJaW4uY2xvc2UoKTsKCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCS8vIGlnbm9yZQoJCQl9CgkJfQoJfQp9