From sanjal at redhat.com Thu Apr 12 02:35:30 2012 Content-Type: multipart/mixed; boundary="===============2208714375700471964==" MIME-Version: 1.0 From: Shireesh Anjal To: devel at ovirt.org Subject: [Engine-devel] Query regarding ValidationUtils#validateInputs Date: Thu, 12 Apr 2012 12:05:25 +0530 Message-ID: <4F8677AD.2090304@redhat.com> --===============2208714375700471964== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable This is a multi-part message in MIME format. --------------060906010904020105000601 Content-Type: text/plain; charset=3DISO-8859-1; format=3Dflowed Content-Transfer-Encoding: 7bit Hi, This is regarding the following validation method we have in = ValidationUtils: /public static ArrayList = validateInputs(List> validationGroupList, T parameters);/ I there any particular reason for supporting the validations only on = objects of classes derived from VdcActionParametersBase? I guess this = was done because this method is primarily intended to validate the = action parameters passed to a BLL action, using the validation = annotations on the parameter class. However I think this method can be = useful for general use as well. e.g. I cannot add a "@Valid" annotation = on a "list" or a "map" in a parameter class. So I need to iterate over = the list/map, and validate each element inside the loop. The validation = inside the loop can also utilize the above method if the restriction = "extends VdcActionParametersBase" is removed. This will allow me to do = the following in the canDoAction method: protected boolean canDoAction() { ... for(GlusterBrickEntity brick : = getParameters().getGlusterVolume().getBricks()) { List errors =3D = ValidationUtils.validateInputs(getValidationGroups(), brick); if(errors !=3D null) { for(String error : errors) { addCanDoActionMessage(error); } } } ... } Regards, Shireesh --------------060906010904020105000601 Content-Type: text/html; charset=3DISO-8859-1 Content-Transfer-Encoding: 7bit Hi,

This is regarding the following validation method we have in ValidationUtils:

public static <T extends VdcActionParametersBase> ArrayList<String> validateInputs(List<Class<?>> validationGroupList, T parameters);

I there any particular reason for supporting the validations only on objects of classes derived from VdcActionParametersBase? I guess this was done because this method is primarily intended to validate the action parameters passed to a BLL action, using the validation annotations on the parameter class. However I think this method can be useful for general use as well. e.g. I cannot add a "@Valid" annotation on a "list" or a "map" in a parameter class. So I need to iterate over the list/map, and validate each element inside the loop. The validation inside the loop can also utilize the above method if the restriction "extends VdcActionParametersBase" is removed. This will allow me to do the following in the canDoAction method:

protected boolean canDoAction() {
...
    for(GlusterBrickEntity brick : getParameters().getGlusterVolume().getBricks()) {
        List<String> errors =3D ValidationUtils.validateInputs(getValidationGroups(), brick);
        if(errors !=3D null) {
            for(= String error : errors) {
            = ;    addCanDoActionMessage(error);
            }
        }
    }
...
}

Regards,
Shireesh
--------------060906010904020105000601-- --===============2208714375700471964== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" VGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KLS0tLS0tLS0tLS0t LS0wNjA5MDYwMTA5MDQwMjAxMDUwMDA2MDEKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy c2V0PUlTTy04ODU5LTE7IGZvcm1hdD1mbG93ZWQKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog N2JpdAoKSGksCgpUaGlzIGlzIHJlZ2FyZGluZyB0aGUgZm9sbG93aW5nIHZhbGlkYXRpb24gbWV0 aG9kIHdlIGhhdmUgaW4gClZhbGlkYXRpb25VdGlsczoKCi9wdWJsaWMgc3RhdGljIDxUIGV4dGVu ZHMgVmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2U+IEFycmF5TGlzdDxTdHJpbmc+IAp2YWxpZGF0ZUlu cHV0cyhMaXN0PENsYXNzPD8+PiB2YWxpZGF0aW9uR3JvdXBMaXN0LCBUIHBhcmFtZXRlcnMpOy8K CkkgdGhlcmUgYW55IHBhcnRpY3VsYXIgcmVhc29uIGZvciBzdXBwb3J0aW5nIHRoZSB2YWxpZGF0 aW9ucyBvbmx5IG9uIApvYmplY3RzIG9mIGNsYXNzZXMgZGVyaXZlZCBmcm9tIFZkY0FjdGlvblBh cmFtZXRlcnNCYXNlPyBJIGd1ZXNzIHRoaXMgCndhcyBkb25lIGJlY2F1c2UgdGhpcyBtZXRob2Qg aXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIHZhbGlkYXRlIHRoZSAKYWN0aW9uIHBhcmFtZXRlcnMg cGFzc2VkIHRvIGEgQkxMIGFjdGlvbiwgdXNpbmcgdGhlIHZhbGlkYXRpb24gCmFubm90YXRpb25z IG9uIHRoZSBwYXJhbWV0ZXIgY2xhc3MuIEhvd2V2ZXIgSSB0aGluayB0aGlzIG1ldGhvZCBjYW4g YmUgCnVzZWZ1bCBmb3IgZ2VuZXJhbCB1c2UgYXMgd2VsbC4gZS5nLiBJIGNhbm5vdCBhZGQgYSAi QFZhbGlkIiBhbm5vdGF0aW9uIApvbiBhICJsaXN0IiBvciBhICJtYXAiIGluIGEgcGFyYW1ldGVy IGNsYXNzLiBTbyBJIG5lZWQgdG8gaXRlcmF0ZSBvdmVyIAp0aGUgbGlzdC9tYXAsIGFuZCB2YWxp ZGF0ZSBlYWNoIGVsZW1lbnQgaW5zaWRlIHRoZSBsb29wLiBUaGUgdmFsaWRhdGlvbiAKaW5zaWRl IHRoZSBsb29wIGNhbiBhbHNvIHV0aWxpemUgdGhlIGFib3ZlIG1ldGhvZCBpZiB0aGUgcmVzdHJp Y3Rpb24gCiJleHRlbmRzIFZkY0FjdGlvblBhcmFtZXRlcnNCYXNlIiBpcyByZW1vdmVkLiBUaGlz IHdpbGwgYWxsb3cgbWUgdG8gZG8gCnRoZSBmb2xsb3dpbmcgaW4gdGhlIGNhbkRvQWN0aW9uIG1l dGhvZDoKCnByb3RlY3RlZCBib29sZWFuIGNhbkRvQWN0aW9uKCkgewouLi4KICAgICBmb3IoR2x1 c3RlckJyaWNrRW50aXR5IGJyaWNrIDogCmdldFBhcmFtZXRlcnMoKS5nZXRHbHVzdGVyVm9sdW1l KCkuZ2V0QnJpY2tzKCkpIHsKICAgICAgICAgTGlzdDxTdHJpbmc+IGVycm9ycyA9IApWYWxpZGF0 aW9uVXRpbHMudmFsaWRhdGVJbnB1dHMoZ2V0VmFsaWRhdGlvbkdyb3VwcygpLCBicmljayk7CiAg ICAgICAgIGlmKGVycm9ycyAhPSBudWxsKSB7CiAgICAgICAgICAgICBmb3IoU3RyaW5nIGVycm9y IDogZXJyb3JzKSB7CiAgICAgICAgICAgICAgICAgYWRkQ2FuRG9BY3Rpb25NZXNzYWdlKGVycm9y KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLi4uCn0KClJlZ2FyZHMsClNoaXJl ZXNoCgotLS0tLS0tLS0tLS0tLTA2MDkwNjAxMDkwNDAyMDEwNTAwMDYwMQpDb250ZW50LVR5cGU6 IHRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6 IDdiaXQKCjxodG1sPgogIDxoZWFkPgoKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlw ZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgogIDwvaGVhZD4KICA8 Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIj4KICAgIEhpLDxicj4KICAgIDxi cj4KICAgIFRoaXMgaXMgcmVnYXJkaW5nIHRoZSBmb2xsb3dpbmcgdmFsaWRhdGlvbiBtZXRob2Qg d2UgaGF2ZSBpbgogICAgVmFsaWRhdGlvblV0aWxzOjxicj4KICAgIDxicj4KICAgIDxpPnB1Ymxp YyBzdGF0aWMgJmx0O1QgZXh0ZW5kcyBWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZSZndDsKICAgICAg QXJyYXlMaXN0Jmx0O1N0cmluZyZndDsgdmFsaWRhdGVJbnB1dHMoTGlzdCZsdDtDbGFzcyZsdDs/ Jmd0OyZndDsKICAgICAgdmFsaWRhdGlvbkdyb3VwTGlzdCwgVCBwYXJhbWV0ZXJzKTs8L2k+PGJy PgogICAgPGJyPgogICAgSSB0aGVyZSBhbnkgcGFydGljdWxhciByZWFzb24gZm9yIHN1cHBvcnRp bmcgdGhlIHZhbGlkYXRpb25zIG9ubHkgb24KICAgIG9iamVjdHMgb2YgY2xhc3NlcyBkZXJpdmVk IGZyb20gVmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2U/IEkgZ3Vlc3MKICAgIHRoaXMgd2FzIGRvbmUg YmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gdmFsaWRhdGUKICAg IHRoZSBhY3Rpb24gcGFyYW1ldGVycyBwYXNzZWQgdG8gYSBCTEwgYWN0aW9uLCB1c2luZyB0aGUg dmFsaWRhdGlvbgogICAgYW5ub3RhdGlvbnMgb24gdGhlIHBhcmFtZXRlciBjbGFzcy4gSG93ZXZl ciBJIHRoaW5rIHRoaXMgbWV0aG9kIGNhbgogICAgYmUgdXNlZnVsIGZvciBnZW5lcmFsIHVzZSBh cyB3ZWxsLiBlLmcuIEkgY2Fubm90IGFkZCBhICJAVmFsaWQiCiAgICBhbm5vdGF0aW9uIG9uIGEg Imxpc3QiIG9yIGEgIm1hcCIgaW4gYSBwYXJhbWV0ZXIgY2xhc3MuIFNvIEkgbmVlZCB0bwogICAg aXRlcmF0ZSBvdmVyIHRoZSBsaXN0L21hcCwgYW5kIHZhbGlkYXRlIGVhY2ggZWxlbWVudCBpbnNp ZGUgdGhlCiAgICBsb29wLiBUaGUgdmFsaWRhdGlvbiBpbnNpZGUgdGhlIGxvb3AgY2FuIGFsc28g dXRpbGl6ZSB0aGUgYWJvdmUKICAgIG1ldGhvZCBpZiB0aGUgcmVzdHJpY3Rpb24gImV4dGVuZHMg VmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2UiIGlzCiAgICByZW1vdmVkLiBUaGlzIHdpbGwgYWxsb3cg bWUgdG8gZG8gdGhlIGZvbGxvd2luZyBpbiB0aGUgY2FuRG9BY3Rpb24KICAgIG1ldGhvZDo8YnI+ CiAgICA8YnI+CiAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Eb0FjdGlvbigpIHs8YnI+CiAgICAu Li48YnI+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgZm9yKEdsdXN0ZXJCcmlja0VudGl0eSBicmlj ayA6CiAgICBnZXRQYXJhbWV0ZXJzKCkuZ2V0R2x1c3RlclZvbHVtZSgpLmdldEJyaWNrcygpKSB7 PGJyPgogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyBMaXN0Jmx0O1N0 cmluZyZndDsgZXJyb3JzID0KICAgIFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUlucHV0cyhnZXRW YWxpZGF0aW9uR3JvdXBzKCksIGJyaWNrKTs8YnI+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgJm5i c3A7Jm5ic3A7Jm5ic3A7IGlmKGVycm9ycyAhPSBudWxsKSB7PGJyPgogICAgJm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZv cihTdHJpbmcgZXJyb3IgOiBlcnJvcnMpIHs8YnI+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsgYWRkQ2FuRG9BY3Rpb25NZXNzYWdlKGVycm9yKTs8YnI+CiAgICAmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsgfTxicj4KICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9 PGJyPgogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+CiAgICAuLi48YnI+CiAgICB9PGJyPgog ICAgPGJyPgogICAgUmVnYXJkcyw8YnI+CiAgICBTaGlyZWVzaDxicj4KICA8L2JvZHk+CjwvaHRt bD4KCi0tLS0tLS0tLS0tLS0tMDYwOTA2MDEwOTA0MDIwMTA1MDAwNjAxLS0K --===============2208714375700471964==-- From ofrenkel at redhat.com Thu Apr 12 03:50:38 2012 Content-Type: multipart/mixed; boundary="===============8090708423619188435==" MIME-Version: 1.0 From: Omer Frenkel To: devel at ovirt.org Subject: Re: [Engine-devel] Query regarding ValidationUtils#validateInputs Date: Thu, 12 Apr 2012 03:50:37 -0400 Message-ID: <15a5329c-4579-4ef6-b1c8-be0b260e859b@zmail07.collab.prod.int.phx2.redhat.com> In-Reply-To: 4F8677AD.2090304@redhat.com --===============8090708423619188435== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable --=3D_e21defe9-d4a0-4579-ac6e-9f383c6664d2 Content-Type: text/plain; charset=3Dutf-8 Content-Transfer-Encoding: 7bit ----- Original Message ----- > From: "Shireesh Anjal" > To: engine-devel(a)ovirt.org > Sent: Thursday, April 12, 2012 9:35:25 AM > Subject: [Engine-devel] Query regarding > ValidationUtils#validateInputs > Hi, > This is regarding the following validation method we have in > ValidationUtils: > public static ArrayList > validateInputs(List> validationGroupList, T parameters); > I there any particular reason for supporting the validations only on > objects of classes derived from VdcActionParametersBase? I guess > this was done because this method is primarily intended to validate > the action parameters passed to a BLL action, using the validation > annotations on the parameter class. However I think this method can > be useful for general use as well. e.g. I cannot add a "@Valid" > annotation on a "list" or a "map" in a parameter class. So I need to > iterate over the list/map, and validate each element inside the > loop. The validation inside the loop can also utilize the above > method if the restriction "extends VdcActionParametersBase" is > removed. This will allow me to do the following in the canDoAction > method: > protected boolean canDoAction() { > ... > for(GlusterBrickEntity brick : > getParameters().getGlusterVolume().getBricks()) { > List errors =3D > ValidationUtils.validateInputs(getValidationGroups(), brick); > if(errors !=3D null) { > for(String error : errors) { > addCanDoActionMessage(error); > } > } > } > ... > } > Regards, > Shireesh > _______________________________________________ > Engine-devel mailing list > Engine-devel(a)ovirt.org > http://lists.ovirt.org/mailman/listinfo/engine-devel i don't think there is a reason to restrict only for VdcActionParametersBas= e, roy what do you think? = also you can use here = getReturnValue().getCanDoActionMessages().addAll(errors); = instead of going over on all errors. = --=3D_e21defe9-d4a0-4579-ac6e-9f383c6664d2 Content-Type: text/html; charset=3Dutf-8 Content-Transfer-Encoding: 7bit <= div style=3D'font-family: Times New Roman; font-size: 12pt; color: #000000'= >


From: "Shireesh Anjal" <sanjal(a)redhat.com>= ;
To: engine-devel(a)ovirt.org
Sent: Thursday, April 12= , 2012 9:35:25 AM
Subject: [Engine-devel] Query regarding Validat= ionUtils#validateInputs

= = = = Hi,

This is regarding the following validation method we have in ValidationUtils:

public static <T extends VdcActionParametersBase> ArrayList<String> validateInputs(List<Class<?>> validationGroupList, T parameters);

I there any particular reason for supporting the validations only on objects of classes derived from VdcActionParametersBase? I guess this was done because this method is primarily intended to validate the action parameters passed to a BLL action, using the validation annotations on the parameter class. However I think this method can be useful for general use as well. e.g. I cannot add a "@Valid" annotation on a "list" or a "map" in a parameter class. So I need to iterate over the list/map, and validate each element inside the loop. The validation inside the loop can also utilize the above method if the restriction "extends VdcActionParametersBase" is removed. This will allow me to do the following in the canDoAction method:

protected boolean canDoAction() {
...
    for(GlusterBrickEntity brick : getParameters().getGlusterVolume().getBricks()) {
        List<String> errors =3D ValidationUtils.validateInputs(getValidationGroups(), brick);
        if(errors !=3D null) {
            for(= String error : errors) {
            = ;    addCanDoActionMessage(error);
            }
        }
    }
...
}

Regards,
Shireesh
=
_______________________________________________
Engine-devel mailing= list
Engine-devel(a)ovirt.org
http://lists.ovirt.org/mailman/listinf= o/engine-devel
i don't think there is a reason to restrict = only for VdcActionParametersBase, roy what do you think?

also you ca= n use here
getReturnValue().getCanDoActionMessages().addAll(errors);
= instead of going over on all errors.
--=3D_e21defe9-d4a0-4579-ac6e-9f383c6664d2-- --===============8090708423619188435== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" LS09X2UyMWRlZmU5LWQ0YTAtNDU3OS1hYzZlLTlmMzgzYzY2NjRkMgpDb250ZW50LVR5cGU6IHRl eHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAoK LS0tLS0gT3JpZ2luYWwgTWVzc2FnZSAtLS0tLQoKPiBGcm9tOiAiU2hpcmVlc2ggQW5qYWwiIDxz YW5qYWxAcmVkaGF0LmNvbT4KPiBUbzogZW5naW5lLWRldmVsQG92aXJ0Lm9yZwo+IFNlbnQ6IFRo dXJzZGF5LCBBcHJpbCAxMiwgMjAxMiA5OjM1OjI1IEFNCj4gU3ViamVjdDogW0VuZ2luZS1kZXZl bF0gUXVlcnkgcmVnYXJkaW5nCj4gVmFsaWRhdGlvblV0aWxzI3ZhbGlkYXRlSW5wdXRzCgo+IEhp LAoKPiBUaGlzIGlzIHJlZ2FyZGluZyB0aGUgZm9sbG93aW5nIHZhbGlkYXRpb24gbWV0aG9kIHdl IGhhdmUgaW4KPiBWYWxpZGF0aW9uVXRpbHM6Cgo+IHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBW ZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZT4gQXJyYXlMaXN0PFN0cmluZz4KPiB2YWxpZGF0ZUlucHV0 cyhMaXN0PENsYXNzPD8+PiB2YWxpZGF0aW9uR3JvdXBMaXN0LCBUIHBhcmFtZXRlcnMpOwoKPiBJ IHRoZXJlIGFueSBwYXJ0aWN1bGFyIHJlYXNvbiBmb3Igc3VwcG9ydGluZyB0aGUgdmFsaWRhdGlv bnMgb25seSBvbgo+IG9iamVjdHMgb2YgY2xhc3NlcyBkZXJpdmVkIGZyb20gVmRjQWN0aW9uUGFy YW1ldGVyc0Jhc2U/IEkgZ3Vlc3MKPiB0aGlzIHdhcyBkb25lIGJlY2F1c2UgdGhpcyBtZXRob2Qg aXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIHZhbGlkYXRlCj4gdGhlIGFjdGlvbiBwYXJhbWV0ZXJz IHBhc3NlZCB0byBhIEJMTCBhY3Rpb24sIHVzaW5nIHRoZSB2YWxpZGF0aW9uCj4gYW5ub3RhdGlv bnMgb24gdGhlIHBhcmFtZXRlciBjbGFzcy4gSG93ZXZlciBJIHRoaW5rIHRoaXMgbWV0aG9kIGNh bgo+IGJlIHVzZWZ1bCBmb3IgZ2VuZXJhbCB1c2UgYXMgd2VsbC4gZS5nLiBJIGNhbm5vdCBhZGQg YSAiQFZhbGlkIgo+IGFubm90YXRpb24gb24gYSAibGlzdCIgb3IgYSAibWFwIiBpbiBhIHBhcmFt ZXRlciBjbGFzcy4gU28gSSBuZWVkIHRvCj4gaXRlcmF0ZSBvdmVyIHRoZSBsaXN0L21hcCwgYW5k IHZhbGlkYXRlIGVhY2ggZWxlbWVudCBpbnNpZGUgdGhlCj4gbG9vcC4gVGhlIHZhbGlkYXRpb24g aW5zaWRlIHRoZSBsb29wIGNhbiBhbHNvIHV0aWxpemUgdGhlIGFib3ZlCj4gbWV0aG9kIGlmIHRo ZSByZXN0cmljdGlvbiAiZXh0ZW5kcyBWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZSIgaXMKPiByZW1v dmVkLiBUaGlzIHdpbGwgYWxsb3cgbWUgdG8gZG8gdGhlIGZvbGxvd2luZyBpbiB0aGUgY2FuRG9B Y3Rpb24KPiBtZXRob2Q6Cgo+IHByb3RlY3RlZCBib29sZWFuIGNhbkRvQWN0aW9uKCkgewo+IC4u Lgo+IGZvcihHbHVzdGVyQnJpY2tFbnRpdHkgYnJpY2sgOgo+IGdldFBhcmFtZXRlcnMoKS5nZXRH bHVzdGVyVm9sdW1lKCkuZ2V0QnJpY2tzKCkpIHsKPiBMaXN0PFN0cmluZz4gZXJyb3JzID0KPiBW YWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJbnB1dHMoZ2V0VmFsaWRhdGlvbkdyb3VwcygpLCBicmlj ayk7Cj4gaWYoZXJyb3JzICE9IG51bGwpIHsKPiBmb3IoU3RyaW5nIGVycm9yIDogZXJyb3JzKSB7 Cj4gYWRkQ2FuRG9BY3Rpb25NZXNzYWdlKGVycm9yKTsKPiB9Cj4gfQo+IH0KPiAuLi4KPiB9Cgo+ IFJlZ2FyZHMsCj4gU2hpcmVlc2gKCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KPiBFbmdpbmUtZGV2ZWwgbWFpbGluZyBsaXN0Cj4gRW5naW5lLWRldmVs QG92aXJ0Lm9yZwo+IGh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFpbG1hbi9saXN0aW5mby9lbmdp bmUtZGV2ZWwKCmkgZG9uJ3QgdGhpbmsgdGhlcmUgaXMgYSByZWFzb24gdG8gcmVzdHJpY3Qgb25s eSBmb3IgVmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2UsIHJveSB3aGF0IGRvIHlvdSB0aGluaz8gCgph bHNvIHlvdSBjYW4gdXNlIGhlcmUgCmdldFJldHVyblZhbHVlKCkuZ2V0Q2FuRG9BY3Rpb25NZXNz YWdlcygpLmFkZEFsbChlcnJvcnMpOyAKaW5zdGVhZCBvZiBnb2luZyBvdmVyIG9uIGFsbCBlcnJv cnMuIAoKLS09X2UyMWRlZmU5LWQ0YTAtNDU3OS1hYzZlLTlmMzgzYzY2NjRkMgpDb250ZW50LVR5 cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3 Yml0Cgo8aHRtbD48aGVhZD48c3R5bGUgdHlwZT0ndGV4dC9jc3MnPnAgeyBtYXJnaW46IDA7IH08 L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2IHN0eWxlPSdmb250LWZhbWlseTogVGltZXMgTmV3IFJv bWFuOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiAjMDAwMDAwJz48YnI+PGJyPjxociBpZD0iendj aHIiPjxibG9ja3F1b3RlIHN0eWxlPSJib3JkZXItbGVmdDoycHggc29saWQgcmdiKDE2LCAxNiwg MjU1KTttYXJnaW4tbGVmdDo1cHg7cGFkZGluZy1sZWZ0OjVweDtjb2xvcjojMDAwO2ZvbnQtd2Vp Z2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZTtmb250LWZh bWlseTpIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTJwdDsiPjxiPkZyb206 IDwvYj4iU2hpcmVlc2ggQW5qYWwiICZsdDtzYW5qYWxAcmVkaGF0LmNvbSZndDs8YnI+PGI+VG86 IDwvYj5lbmdpbmUtZGV2ZWxAb3ZpcnQub3JnPGJyPjxiPlNlbnQ6IDwvYj5UaHVyc2RheSwgQXBy aWwgMTIsIDIwMTIgOTozNToyNSBBTTxicj48Yj5TdWJqZWN0OiA8L2I+W0VuZ2luZS1kZXZlbF0g UXVlcnkgcmVnYXJkaW5nIFZhbGlkYXRpb25VdGlscyN2YWxpZGF0ZUlucHV0czxicj48YnI+CiAg CgogICAgCiAgCiAgCiAgICBIaSw8YnI+CiAgICA8YnI+CiAgICBUaGlzIGlzIHJlZ2FyZGluZyB0 aGUgZm9sbG93aW5nIHZhbGlkYXRpb24gbWV0aG9kIHdlIGhhdmUgaW4KICAgIFZhbGlkYXRpb25V dGlsczo8YnI+CiAgICA8YnI+CiAgICA8aT5wdWJsaWMgc3RhdGljICZsdDtUIGV4dGVuZHMgVmRj QWN0aW9uUGFyYW1ldGVyc0Jhc2UmZ3Q7CiAgICAgIEFycmF5TGlzdCZsdDtTdHJpbmcmZ3Q7IHZh bGlkYXRlSW5wdXRzKExpc3QmbHQ7Q2xhc3MmbHQ7PyZndDsmZ3Q7CiAgICAgIHZhbGlkYXRpb25H cm91cExpc3QsIFQgcGFyYW1ldGVycyk7PC9pPjxicj4KICAgIDxicj4KICAgIEkgdGhlcmUgYW55 IHBhcnRpY3VsYXIgcmVhc29uIGZvciBzdXBwb3J0aW5nIHRoZSB2YWxpZGF0aW9ucyBvbmx5IG9u CiAgICBvYmplY3RzIG9mIGNsYXNzZXMgZGVyaXZlZCBmcm9tIFZkY0FjdGlvblBhcmFtZXRlcnNC YXNlPyBJIGd1ZXNzCiAgICB0aGlzIHdhcyBkb25lIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMgcHJp bWFyaWx5IGludGVuZGVkIHRvIHZhbGlkYXRlCiAgICB0aGUgYWN0aW9uIHBhcmFtZXRlcnMgcGFz c2VkIHRvIGEgQkxMIGFjdGlvbiwgdXNpbmcgdGhlIHZhbGlkYXRpb24KICAgIGFubm90YXRpb25z IG9uIHRoZSBwYXJhbWV0ZXIgY2xhc3MuIEhvd2V2ZXIgSSB0aGluayB0aGlzIG1ldGhvZCBjYW4K ICAgIGJlIHVzZWZ1bCBmb3IgZ2VuZXJhbCB1c2UgYXMgd2VsbC4gZS5nLiBJIGNhbm5vdCBhZGQg YSAiQFZhbGlkIgogICAgYW5ub3RhdGlvbiBvbiBhICJsaXN0IiBvciBhICJtYXAiIGluIGEgcGFy YW1ldGVyIGNsYXNzLiBTbyBJIG5lZWQgdG8KICAgIGl0ZXJhdGUgb3ZlciB0aGUgbGlzdC9tYXAs IGFuZCB2YWxpZGF0ZSBlYWNoIGVsZW1lbnQgaW5zaWRlIHRoZQogICAgbG9vcC4gVGhlIHZhbGlk YXRpb24gaW5zaWRlIHRoZSBsb29wIGNhbiBhbHNvIHV0aWxpemUgdGhlIGFib3ZlCiAgICBtZXRo b2QgaWYgdGhlIHJlc3RyaWN0aW9uICJleHRlbmRzIFZkY0FjdGlvblBhcmFtZXRlcnNCYXNlIiBp cwogICAgcmVtb3ZlZC4gVGhpcyB3aWxsIGFsbG93IG1lIHRvIGRvIHRoZSBmb2xsb3dpbmcgaW4g dGhlIGNhbkRvQWN0aW9uCiAgICBtZXRob2Q6PGJyPgogICAgPGJyPgogICAgcHJvdGVjdGVkIGJv b2xlYW4gY2FuRG9BY3Rpb24oKSB7PGJyPgogICAgLi4uPGJyPgogICAgJm5ic3A7Jm5ic3A7Jm5i c3A7IGZvcihHbHVzdGVyQnJpY2tFbnRpdHkgYnJpY2sgOgogICAgZ2V0UGFyYW1ldGVycygpLmdl dEdsdXN0ZXJWb2x1bWUoKS5nZXRCcmlja3MoKSkgezxicj4KICAgICZuYnNwOyZuYnNwOyZuYnNw OyAmbmJzcDsmbmJzcDsmbmJzcDsgTGlzdCZsdDtTdHJpbmcmZ3Q7IGVycm9ycyA9CiAgICBWYWxp ZGF0aW9uVXRpbHMudmFsaWRhdGVJbnB1dHMoZ2V0VmFsaWRhdGlvbkdyb3VwcygpLCBicmljayk7 PGJyPgogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyBpZihlcnJvcnMg IT0gbnVsbCkgezxicj4KICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBmb3IoU3RyaW5nIGVycm9yIDogZXJyb3JzKSB7 PGJyPgogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGFkZENhbkRvQWN0aW9u TWVzc2FnZShlcnJvcik7PGJyPgogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+CiAgICAmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KICAgICZuYnNwOyZuYnNwOyZuYnNw OyB9PGJyPgogICAgLi4uPGJyPgogICAgfTxicj4KICAgIDxicj4KICAgIFJlZ2FyZHMsPGJyPgog ICAgU2hpcmVlc2g8YnI+CiAgCgo8YnI+X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX188YnI+RW5naW5lLWRldmVsIG1haWxpbmcgbGlzdDxicj5FbmdpbmUtZGV2 ZWxAb3ZpcnQub3JnPGJyPmh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFpbG1hbi9saXN0aW5mby9l bmdpbmUtZGV2ZWw8YnI+PC9ibG9ja3F1b3RlPmkgZG9uJ3QgdGhpbmsgdGhlcmUgaXMgYSByZWFz b24gdG8gcmVzdHJpY3Qgb25seSBmb3IgVmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2UsIHJveSB3aGF0 IGRvIHlvdSB0aGluaz88YnI+PGJyPmFsc28geW91IGNhbiB1c2UgaGVyZTxicj5nZXRSZXR1cm5W YWx1ZSgpLmdldENhbkRvQWN0aW9uTWVzc2FnZXMoKS5hZGRBbGwoZXJyb3JzKTs8YnI+aW5zdGVh ZCBvZiBnb2luZyBvdmVyIG9uIGFsbCBlcnJvcnMuPGJyPjwvZGl2PjwvYm9keT48L2h0bWw+Ci0t PV9lMjFkZWZlOS1kNGEwLTQ1NzktYWM2ZS05ZjM4M2M2NjY0ZDItLQo= --===============8090708423619188435==-- From rgolan at redhat.com Sun Apr 15 02:01:34 2012 Content-Type: multipart/mixed; boundary="===============3228591048772217464==" MIME-Version: 1.0 From: Roy Golan To: devel at ovirt.org Subject: Re: [Engine-devel] Query regarding ValidationUtils#validateInputs Date: Sun, 15 Apr 2012 09:01:32 +0300 Message-ID: <4F8A643C.8060605@redhat.com> In-Reply-To: 15a5329c-4579-4ef6-b1c8-be0b260e859b@zmail07.collab.prod.int.phx2.redhat.com --===============3228591048772217464== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable This is a multi-part message in MIME format. --------------080707050808080009010909 Content-Type: text/plain; charset=3DUTF-8; format=3Dflowed Content-Transfer-Encoding: 7bit On 04/12/2012 10:50 AM, Omer Frenkel wrote: > > > ------------------------------------------------------------------------ > > *From: *"Shireesh Anjal" > *To: *engine-devel(a)ovirt.org > *Sent: *Thursday, April 12, 2012 9:35:25 AM > *Subject: *[Engine-devel] Query regarding > ValidationUtils#validateInputs > > Hi, > > This is regarding the following validation method we have in > ValidationUtils: > > /public static > ArrayList validateInputs(List> > validationGroupList, T parameters);/ > > I there any particular reason for supporting the validations only > on objects of classes derived from VdcActionParametersBase? I > guess this was done because this method is primarily intended to > validate the action parameters passed to a BLL action, using the > validation annotations on the parameter class. However I think > this method can be useful for general use as well. e.g. I cannot > add a "@Valid" annotation on a "list" or a "map" in a parameter > class. So I need to iterate over the list/map, and validate each > element inside the loop. The validation inside the loop can also > utilize the above method if the restriction "extends > VdcActionParametersBase" is removed. This will allow me to do the > following in the canDoAction method: > > protected boolean canDoAction() { > ... > for(GlusterBrickEntity brick : > getParameters().getGlusterVolume().getBricks()) { > List errors =3D > ValidationUtils.validateInputs(getValidationGroups(), brick); > if(errors !=3D null) { > for(String error : errors) { > addCanDoActionMessage(error); > } > } > } > ... > } > > Regards, > Shireesh > > _______________________________________________ > Engine-devel mailing list > Engine-devel(a)ovirt.org > http://lists.ovirt.org/mailman/listinfo/engine-devel > > i don't think there is a reason to restrict only for = > VdcActionParametersBase, roy what do you think? > > also you can use here > getReturnValue().getCanDoActionMessages().addAll(errors); > instead of going over on all errors. pls see SetupNetworksParameters.java for validating a list of network = interfaces. hibernate validator supports trivial object graphs and members that are = arrays, list and java.util.map implementations. If your code looks like that it should work. If you are using special = validation groups please add them to your command with addValidationGroups. this should work: GlusterCommandParameters.java @Valid List bricks Bricks.java @NotNull Guid id --------------080707050808080009010909 Content-Type: text/html; charset=3DUTF-8 Content-Transfer-Encoding: 8bit On 04/12/2012 10:50 AM, Omer Frenkel wrote:



From: "Shireesh Anjal" <sanjal(a)redhat.com>
To: engine-devel(a)ovirt.org
Sent: Thursday, April 12, 2012 9:35:25 AM
Subject: [Engine-devel] Query regarding ValidationUtils#validateInputs

Hi,

This is regarding the following validation method we have in ValidationUtils:

public static <T extends VdcActionParametersBase> ArrayList<String> validateInputs(List<Class<?>> validationGroupList, T parameters);

I there any particular reason for supporting the validations only on objects of classes derived from VdcActionParametersBase? I guess this was done because this method is primarily intended to validate the action parameters passed to a BLL action, using the validation annotations on the parameter class. However I think this method can be useful for general use as well. e.g. I cannot add a "@Valid" annotation on a "list" or a "map" in a parameter class. So I need to iterate over the list/map, and validate each element inside the loop. The validation inside the loop can also utilize the above method if the restriction "extends VdcActionParametersBase" is removed. This will allow me to do the following in the canDoAction method:

protected boolean canDoAction() {
...
=C2=A0=C2=A0=C2=A0 for(GlusterBrickEntity brick : getParameters().getGlusterVolume().getBricks()) {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 List<String> errors = =3D ValidationUtils.validateInputs(getValidationGroups(), brick);
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if(errors !=3D null) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 for(String error : errors) {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 addCanDoActionMessage(error);
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 }
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0 }
...
}

Regards,
Shireesh

_______________________________________________
Engine-devel mailing list
Engine-devel(a)ovirt.org
http://lists.ovirt.org/mailman/listinfo/eng= ine-devel
i don't think there is a reason to restrict only for VdcActionParametersBase, roy what do you think?

also you can use here
getReturnValue().getCanDoActionMessages().addAll(errors);
instead of going over on all errors.

pls see SetupNetworksParameters.java for validating a list of network interfaces.

hibernate validator supports trivial object graphs and members that are arrays, list and java.util.map implementations.
If your code looks like that it should work. If you are using special validation groups please add them to your command with addValidationGroups.

this should work:

GlusterCommandParameters.java
=C2=A0@Valid
=C2=A0List<Bricks> bricks

=C2=A0Bricks.java
=C2=A0@NotNull
=C2=A0Guid id
--------------080707050808080009010909-- --===============3228591048772217464== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" VGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KLS0tLS0tLS0tLS0t LS0wODA3MDcwNTA4MDgwODAwMDkwMTA5MDkKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy c2V0PVVURi04OyBmb3JtYXQ9Zmxvd2VkCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQK Ck9uIDA0LzEyLzIwMTIgMTA6NTAgQU0sIE9tZXIgRnJlbmtlbCB3cm90ZToKPgo+Cj4gLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCj4KPiAgICAgKkZyb206ICoiU2hpcmVlc2ggQW5qYWwiIDxzYW5qYWxAcmVkaGF0 LmNvbT4KPiAgICAgKlRvOiAqZW5naW5lLWRldmVsQG92aXJ0Lm9yZwo+ICAgICAqU2VudDogKlRo dXJzZGF5LCBBcHJpbCAxMiwgMjAxMiA5OjM1OjI1IEFNCj4gICAgICpTdWJqZWN0OiAqW0VuZ2lu ZS1kZXZlbF0gUXVlcnkgcmVnYXJkaW5nCj4gICAgIFZhbGlkYXRpb25VdGlscyN2YWxpZGF0ZUlu cHV0cwo+Cj4gICAgIEhpLAo+Cj4gICAgIFRoaXMgaXMgcmVnYXJkaW5nIHRoZSBmb2xsb3dpbmcg dmFsaWRhdGlvbiBtZXRob2Qgd2UgaGF2ZSBpbgo+ICAgICBWYWxpZGF0aW9uVXRpbHM6Cj4KPiAg ICAgL3B1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZT4KPiAg ICAgQXJyYXlMaXN0PFN0cmluZz4gdmFsaWRhdGVJbnB1dHMoTGlzdDxDbGFzczw/Pj4KPiAgICAg dmFsaWRhdGlvbkdyb3VwTGlzdCwgVCBwYXJhbWV0ZXJzKTsvCj4KPiAgICAgSSB0aGVyZSBhbnkg cGFydGljdWxhciByZWFzb24gZm9yIHN1cHBvcnRpbmcgdGhlIHZhbGlkYXRpb25zIG9ubHkKPiAg ICAgb24gb2JqZWN0cyBvZiBjbGFzc2VzIGRlcml2ZWQgZnJvbSBWZGNBY3Rpb25QYXJhbWV0ZXJz QmFzZT8gSQo+ICAgICBndWVzcyB0aGlzIHdhcyBkb25lIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMg cHJpbWFyaWx5IGludGVuZGVkIHRvCj4gICAgIHZhbGlkYXRlIHRoZSBhY3Rpb24gcGFyYW1ldGVy cyBwYXNzZWQgdG8gYSBCTEwgYWN0aW9uLCB1c2luZyB0aGUKPiAgICAgdmFsaWRhdGlvbiBhbm5v dGF0aW9ucyBvbiB0aGUgcGFyYW1ldGVyIGNsYXNzLiBIb3dldmVyIEkgdGhpbmsKPiAgICAgdGhp cyBtZXRob2QgY2FuIGJlIHVzZWZ1bCBmb3IgZ2VuZXJhbCB1c2UgYXMgd2VsbC4gZS5nLiBJIGNh bm5vdAo+ICAgICBhZGQgYSAiQFZhbGlkIiBhbm5vdGF0aW9uIG9uIGEgImxpc3QiIG9yIGEgIm1h cCIgaW4gYSBwYXJhbWV0ZXIKPiAgICAgY2xhc3MuIFNvIEkgbmVlZCB0byBpdGVyYXRlIG92ZXIg dGhlIGxpc3QvbWFwLCBhbmQgdmFsaWRhdGUgZWFjaAo+ICAgICBlbGVtZW50IGluc2lkZSB0aGUg bG9vcC4gVGhlIHZhbGlkYXRpb24gaW5zaWRlIHRoZSBsb29wIGNhbiBhbHNvCj4gICAgIHV0aWxp emUgdGhlIGFib3ZlIG1ldGhvZCBpZiB0aGUgcmVzdHJpY3Rpb24gImV4dGVuZHMKPiAgICAgVmRj QWN0aW9uUGFyYW1ldGVyc0Jhc2UiIGlzIHJlbW92ZWQuIFRoaXMgd2lsbCBhbGxvdyBtZSB0byBk byB0aGUKPiAgICAgZm9sbG93aW5nIGluIHRoZSBjYW5Eb0FjdGlvbiBtZXRob2Q6Cj4KPiAgICAg cHJvdGVjdGVkIGJvb2xlYW4gY2FuRG9BY3Rpb24oKSB7Cj4gICAgIC4uLgo+ICAgICAgICAgZm9y KEdsdXN0ZXJCcmlja0VudGl0eSBicmljayA6Cj4gICAgIGdldFBhcmFtZXRlcnMoKS5nZXRHbHVz dGVyVm9sdW1lKCkuZ2V0QnJpY2tzKCkpIHsKPiAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZXJy b3JzID0KPiAgICAgVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSW5wdXRzKGdldFZhbGlkYXRpb25H cm91cHMoKSwgYnJpY2spOwo+ICAgICAgICAgICAgIGlmKGVycm9ycyAhPSBudWxsKSB7Cj4gICAg ICAgICAgICAgICAgIGZvcihTdHJpbmcgZXJyb3IgOiBlcnJvcnMpIHsKPiAgICAgICAgICAgICAg ICAgICAgIGFkZENhbkRvQWN0aW9uTWVzc2FnZShlcnJvcik7Cj4gICAgICAgICAgICAgICAgIH0K PiAgICAgICAgICAgICB9Cj4gICAgICAgICB9Cj4gICAgIC4uLgo+ICAgICB9Cj4KPiAgICAgUmVn YXJkcywKPiAgICAgU2hpcmVlc2gKPgo+ICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwo+ICAgICBFbmdpbmUtZGV2ZWwgbWFpbGluZyBsaXN0Cj4gICAg IEVuZ2luZS1kZXZlbEBvdmlydC5vcmcKPiAgICAgaHR0cDovL2xpc3RzLm92aXJ0Lm9yZy9tYWls bWFuL2xpc3RpbmZvL2VuZ2luZS1kZXZlbAo+Cj4gaSBkb24ndCB0aGluayB0aGVyZSBpcyBhIHJl YXNvbiB0byByZXN0cmljdCBvbmx5IGZvciAKPiBWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZSwgcm95 IHdoYXQgZG8geW91IHRoaW5rPwo+Cj4gYWxzbyB5b3UgY2FuIHVzZSBoZXJlCj4gZ2V0UmV0dXJu VmFsdWUoKS5nZXRDYW5Eb0FjdGlvbk1lc3NhZ2VzKCkuYWRkQWxsKGVycm9ycyk7Cj4gaW5zdGVh ZCBvZiBnb2luZyBvdmVyIG9uIGFsbCBlcnJvcnMuCgpwbHMgc2VlIFNldHVwTmV0d29ya3NQYXJh bWV0ZXJzLmphdmEgZm9yIHZhbGlkYXRpbmcgYSBsaXN0IG9mIG5ldHdvcmsgCmludGVyZmFjZXMu CgpoaWJlcm5hdGUgdmFsaWRhdG9yIHN1cHBvcnRzIHRyaXZpYWwgb2JqZWN0IGdyYXBocyBhbmQg bWVtYmVycyB0aGF0IGFyZSAKYXJyYXlzLCBsaXN0IGFuZCBqYXZhLnV0aWwubWFwIGltcGxlbWVu dGF0aW9ucy4KSWYgeW91ciBjb2RlIGxvb2tzIGxpa2UgdGhhdCBpdCBzaG91bGQgd29yay4gSWYg eW91IGFyZSB1c2luZyBzcGVjaWFsIAp2YWxpZGF0aW9uIGdyb3VwcyBwbGVhc2UgYWRkIHRoZW0g dG8geW91ciBjb21tYW5kIHdpdGggYWRkVmFsaWRhdGlvbkdyb3Vwcy4KCnRoaXMgc2hvdWxkIHdv cms6CgpHbHVzdGVyQ29tbWFuZFBhcmFtZXRlcnMuamF2YQogIEBWYWxpZAogIExpc3Q8QnJpY2tz PiBicmlja3MKCiAgQnJpY2tzLmphdmEKICBATm90TnVsbAogIEd1aWQgaWQKCi0tLS0tLS0tLS0t LS0tMDgwNzA3MDUwODA4MDgwMDA5MDEwOTA5CkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFy c2V0PVVURi04CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKCjxodG1sPgogIDxoZWFk PgogICAgPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBodHRwLWVxdWl2 PSJDb250ZW50LVR5cGUiPgogIDwvaGVhZD4KICA8Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9y PSIjRkZGRkZGIj4KICAgIE9uIDA0LzEyLzIwMTIgMTA6NTAgQU0sIE9tZXIgRnJlbmtlbCB3cm90 ZToKICAgIDxibG9ja3F1b3RlCmNpdGU9Im1pZDoxNWE1MzI5Yy00NTc5LTRlZjYtYjFjOC1iZTBi MjYwZTg1OWJAem1haWwwNy5jb2xsYWIucHJvZC5pbnQucGh4Mi5yZWRoYXQuY29tIgogICAgICB0 eXBlPSJjaXRlIj4KICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj5wIHsgbWFyZ2luOiAwOyB9 PC9zdHlsZT4KICAgICAgPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IFRpbWVzIE5ldyBSb21hbjsg Zm9udC1zaXplOiAxMnB0OyBjb2xvcjoKICAgICAgICAjMDAwMDAwIj48YnI+CiAgICAgICAgPGJy PgogICAgICAgIDxociBpZD0iendjaHIiPgogICAgICAgIDxibG9ja3F1b3RlIHN0eWxlPSJib3Jk ZXItbGVmdDoycHggc29saWQgcmdiKDE2LCAxNiwKMjU1KTttYXJnaW4tbGVmdDo1cHg7cGFkZGlu Zy1sZWZ0OjVweDtjb2xvcjojMDAwO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1h bDt0ZXh0LWRlY29yYXRpb246bm9uZTtmb250LWZhbWlseTpIZWx2ZXRpY2EsQXJpYWwsc2Fucy1z ZXJpZjtmb250LXNpemU6MTJwdDsiPjxiPkZyb206CiAgICAgICAgICA8L2I+IlNoaXJlZXNoIEFu amFsIiA8YSBjbGFzcz0ibW96LXR4dC1saW5rLXJmYzIzOTZFIiBocmVmPSJtYWlsdG86c2FuamFs QHJlZGhhdC5jb20iPiZsdDtzYW5qYWxAcmVkaGF0LmNvbSZndDs8L2E+PGJyPgogICAgICAgICAg PGI+VG86IDwvYj48YSBjbGFzcz0ibW96LXR4dC1saW5rLWFiYnJldmlhdGVkIiBocmVmPSJtYWls dG86ZW5naW5lLWRldmVsQG92aXJ0Lm9yZyI+ZW5naW5lLWRldmVsQG92aXJ0Lm9yZzwvYT48YnI+ CiAgICAgICAgICA8Yj5TZW50OiA8L2I+VGh1cnNkYXksIEFwcmlsIDEyLCAyMDEyIDk6MzU6MjUg QU08YnI+CiAgICAgICAgICA8Yj5TdWJqZWN0OiA8L2I+W0VuZ2luZS1kZXZlbF0gUXVlcnkgcmVn YXJkaW5nCiAgICAgICAgICBWYWxpZGF0aW9uVXRpbHMjdmFsaWRhdGVJbnB1dHM8YnI+CiAgICAg ICAgICA8YnI+CiAgICAgICAgICBIaSw8YnI+CiAgICAgICAgICA8YnI+CiAgICAgICAgICBUaGlz IGlzIHJlZ2FyZGluZyB0aGUgZm9sbG93aW5nIHZhbGlkYXRpb24gbWV0aG9kIHdlIGhhdmUgaW4K ICAgICAgICAgIFZhbGlkYXRpb25VdGlsczo8YnI+CiAgICAgICAgICA8YnI+CiAgICAgICAgICA8 aT5wdWJsaWMgc3RhdGljICZsdDtUIGV4dGVuZHMgVmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2UmZ3Q7 CiAgICAgICAgICAgIEFycmF5TGlzdCZsdDtTdHJpbmcmZ3Q7CiAgICAgICAgICAgIHZhbGlkYXRl SW5wdXRzKExpc3QmbHQ7Q2xhc3MmbHQ7PyZndDsmZ3Q7CiAgICAgICAgICAgIHZhbGlkYXRpb25H cm91cExpc3QsIFQgcGFyYW1ldGVycyk7PC9pPjxicj4KICAgICAgICAgIDxicj4KICAgICAgICAg IEkgdGhlcmUgYW55IHBhcnRpY3VsYXIgcmVhc29uIGZvciBzdXBwb3J0aW5nIHRoZSB2YWxpZGF0 aW9ucwogICAgICAgICAgb25seSBvbiBvYmplY3RzIG9mIGNsYXNzZXMgZGVyaXZlZCBmcm9tCiAg ICAgICAgICBWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZT8gSSBndWVzcyB0aGlzIHdhcyBkb25lIGJl Y2F1c2UgdGhpcwogICAgICAgICAgbWV0aG9kIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byB2YWxp ZGF0ZSB0aGUgYWN0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgIHBhc3NlZCB0byBhIEJMTCBhY3Rp b24sIHVzaW5nIHRoZSB2YWxpZGF0aW9uIGFubm90YXRpb25zIG9uCiAgICAgICAgICB0aGUgcGFy YW1ldGVyIGNsYXNzLiBIb3dldmVyIEkgdGhpbmsgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWZ1bAog ICAgICAgICAgZm9yIGdlbmVyYWwgdXNlIGFzIHdlbGwuIGUuZy4gSSBjYW5ub3QgYWRkIGEgIkBW YWxpZCIKICAgICAgICAgIGFubm90YXRpb24gb24gYSAibGlzdCIgb3IgYSAibWFwIiBpbiBhIHBh cmFtZXRlciBjbGFzcy4gU28gSQogICAgICAgICAgbmVlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGxp c3QvbWFwLCBhbmQgdmFsaWRhdGUgZWFjaCBlbGVtZW50CiAgICAgICAgICBpbnNpZGUgdGhlIGxv b3AuIFRoZSB2YWxpZGF0aW9uIGluc2lkZSB0aGUgbG9vcCBjYW4gYWxzbwogICAgICAgICAgdXRp bGl6ZSB0aGUgYWJvdmUgbWV0aG9kIGlmIHRoZSByZXN0cmljdGlvbiAiZXh0ZW5kcwogICAgICAg ICAgVmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2UiIGlzIHJlbW92ZWQuIFRoaXMgd2lsbCBhbGxvdyBt ZSB0byBkbwogICAgICAgICAgdGhlIGZvbGxvd2luZyBpbiB0aGUgY2FuRG9BY3Rpb24gbWV0aG9k Ojxicj4KICAgICAgICAgIDxicj4KICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkRvQWN0 aW9uKCkgezxicj4KICAgICAgICAgIC4uLjxicj4KICAgICAgICAgIMKgwqDCoCBmb3IoR2x1c3Rl ckJyaWNrRW50aXR5IGJyaWNrIDoKICAgICAgICAgIGdldFBhcmFtZXRlcnMoKS5nZXRHbHVzdGVy Vm9sdW1lKCkuZ2V0QnJpY2tzKCkpIHs8YnI+CiAgICAgICAgICDCoMKgwqAgwqDCoMKgIExpc3Qm bHQ7U3RyaW5nJmd0OyBlcnJvcnMgPQogICAgICAgICAgVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRl SW5wdXRzKGdldFZhbGlkYXRpb25Hcm91cHMoKSwgYnJpY2spOzxicj4KICAgICAgICAgIMKgwqDC oCDCoMKgwqAgaWYoZXJyb3JzICE9IG51bGwpIHs8YnI+CiAgICAgICAgICDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGZvcihTdHJpbmcgZXJyb3IgOiBlcnJvcnMpIHs8YnI+CiAgICAgICAgICDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYWRkQ2FuRG9BY3Rpb25NZXNzYWdlKGVycm9yKTs8 YnI+CiAgICAgICAgICDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH08YnI+CiAgICAgICAgICDCoMKg wqDCoMKgwqDCoCB9PGJyPgogICAgICAgICAgwqDCoMKgIH08YnI+CiAgICAgICAgICAuLi48YnI+ CiAgICAgICAgICB9PGJyPgogICAgICAgICAgPGJyPgogICAgICAgICAgUmVnYXJkcyw8YnI+CiAg ICAgICAgICBTaGlyZWVzaDxicj4KICAgICAgICAgIDxicj4KICAgICAgICAgIF9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPGJyPgogICAgICAgICAgRW5naW5l LWRldmVsIG1haWxpbmcgbGlzdDxicj4KICAgICAgICAgIDxhIGNsYXNzPSJtb3otdHh0LWxpbmst YWJicmV2aWF0ZWQiIGhyZWY9Im1haWx0bzpFbmdpbmUtZGV2ZWxAb3ZpcnQub3JnIj5FbmdpbmUt ZGV2ZWxAb3ZpcnQub3JnPC9hPjxicj4KICAgICAgICAgIDxhIGNsYXNzPSJtb3otdHh0LWxpbmst ZnJlZXRleHQiIGhyZWY9Imh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFpbG1hbi9saXN0aW5mby9l bmdpbmUtZGV2ZWwiPmh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFpbG1hbi9saXN0aW5mby9lbmdp bmUtZGV2ZWw8L2E+PGJyPgogICAgICAgIDwvYmxvY2txdW90ZT4KICAgICAgICBpIGRvbid0IHRo aW5rIHRoZXJlIGlzIGEgcmVhc29uIHRvIHJlc3RyaWN0IG9ubHkgZm9yCiAgICAgICAgVmRjQWN0 aW9uUGFyYW1ldGVyc0Jhc2UsIHJveSB3aGF0IGRvIHlvdSB0aGluaz88YnI+CiAgICAgICAgPGJy PgogICAgICAgIGFsc28geW91IGNhbiB1c2UgaGVyZTxicj4KICAgICAgICBnZXRSZXR1cm5WYWx1 ZSgpLmdldENhbkRvQWN0aW9uTWVzc2FnZXMoKS5hZGRBbGwoZXJyb3JzKTs8YnI+CiAgICAgICAg aW5zdGVhZCBvZiBnb2luZyBvdmVyIG9uIGFsbCBlcnJvcnMuPGJyPgogICAgICA8L2Rpdj4KICAg IDwvYmxvY2txdW90ZT4KICAgIDxicj4KICAgIHBscyBzZWUgU2V0dXBOZXR3b3Jrc1BhcmFtZXRl cnMuamF2YSBmb3IgdmFsaWRhdGluZyBhIGxpc3Qgb2YKICAgIG5ldHdvcmsgaW50ZXJmYWNlcy48 YnI+CiAgICA8YnI+CiAgICBoaWJlcm5hdGUgdmFsaWRhdG9yIHN1cHBvcnRzIHRyaXZpYWwgb2Jq ZWN0IGdyYXBocyBhbmQgbWVtYmVycyB0aGF0CiAgICBhcmUgYXJyYXlzLCBsaXN0IGFuZCBqYXZh LnV0aWwubWFwIGltcGxlbWVudGF0aW9ucy48YnI+CiAgICBJZiB5b3VyIGNvZGUgbG9va3MgbGlr ZSB0aGF0IGl0IHNob3VsZCB3b3JrLiBJZiB5b3UgYXJlIHVzaW5nCiAgICBzcGVjaWFsIHZhbGlk YXRpb24gZ3JvdXBzIHBsZWFzZSBhZGQgdGhlbSB0byB5b3VyIGNvbW1hbmQgd2l0aAogICAgYWRk VmFsaWRhdGlvbkdyb3Vwcy48YnI+CiAgICA8YnI+CiAgICB0aGlzIHNob3VsZCB3b3JrOjxicj4K ICAgIDxicj4KICAgIEdsdXN0ZXJDb21tYW5kUGFyYW1ldGVycy5qYXZhPGJyPgogICAgwqBAVmFs aWQ8YnI+CiAgICDCoExpc3QmbHQ7QnJpY2tzJmd0OyBicmlja3M8YnI+CiAgICA8YnI+CiAgICDC oEJyaWNrcy5qYXZhPGJyPgogICAgwqBATm90TnVsbDxicj4KICAgIMKgR3VpZCBpZDxicj4KICA8 L2JvZHk+CjwvaHRtbD4KCi0tLS0tLS0tLS0tLS0tMDgwNzA3MDUwODA4MDgwMDA5MDEwOTA5LS0K --===============3228591048772217464==-- From sanjal at redhat.com Tue Apr 17 04:59:10 2012 Content-Type: multipart/mixed; boundary="===============3155447487424163763==" MIME-Version: 1.0 From: Shireesh Anjal To: devel at ovirt.org Subject: Re: [Engine-devel] Query regarding ValidationUtils#validateInputs Date: Tue, 17 Apr 2012 14:29:06 +0530 Message-ID: <4F8D30DA.8000609@redhat.com> In-Reply-To: 4F8A643C.8060605@redhat.com --===============3155447487424163763== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable This is a multi-part message in MIME format. --------------000503030108060803000801 Content-Type: text/plain; charset=3DISO-8859-1; format=3Dflowed Content-Transfer-Encoding: 7bit On Sunday 15 April 2012 11:31 AM, Roy Golan wrote: > On 04/12/2012 10:50 AM, Omer Frenkel wrote: >> >> >> ------------------------------------------------------------------------ >> >> *From: *"Shireesh Anjal" >> *To: *engine-devel(a)ovirt.org >> *Sent: *Thursday, April 12, 2012 9:35:25 AM >> *Subject: *[Engine-devel] Query regarding >> ValidationUtils#validateInputs >> >> Hi, >> >> This is regarding the following validation method we have in >> ValidationUtils: >> >> /public static >> ArrayList validateInputs(List> >> validationGroupList, T parameters);/ >> >> I there any particular reason for supporting the validations only >> on objects of classes derived from VdcActionParametersBase? I >> guess this was done because this method is primarily intended to >> validate the action parameters passed to a BLL action, using the >> validation annotations on the parameter class. However I think >> this method can be useful for general use as well. e.g. I cannot >> add a "@Valid" annotation on a "list" or a "map" in a parameter >> class. So I need to iterate over the list/map, and validate each >> element inside the loop. The validation inside the loop can also >> utilize the above method if the restriction "extends >> VdcActionParametersBase" is removed. This will allow me to do the >> following in the canDoAction method: >> >> protected boolean canDoAction() { >> ... >> for(GlusterBrickEntity brick : >> getParameters().getGlusterVolume().getBricks()) { >> List errors =3D >> ValidationUtils.validateInputs(getValidationGroups(), brick); >> if(errors !=3D null) { >> for(String error : errors) { >> addCanDoActionMessage(error); >> } >> } >> } >> ... >> } >> >> Regards, >> Shireesh >> >> _______________________________________________ >> Engine-devel mailing list >> Engine-devel(a)ovirt.org >> http://lists.ovirt.org/mailman/listinfo/engine-devel >> >> i don't think there is a reason to restrict only for = >> VdcActionParametersBase, roy what do you think? >> >> also you can use here >> getReturnValue().getCanDoActionMessages().addAll(errors); >> instead of going over on all errors. > > pls see SetupNetworksParameters.java for validating a list of network = > interfaces. > > hibernate validator supports trivial object graphs and members that = > are arrays, list and java.util.map implementations. > If your code looks like that it should work. If you are using special = > validation groups please add them to your command with = > addValidationGroups. > > this should work: > > GlusterCommandParameters.java > @Valid > List bricks > > Bricks.java > @NotNull > Guid id Thanks! I had tried adding @Valid annotation as suggested above, which = had resulted in an exception from the validation engine, without any = specific information about the problem, and I assumed that @Valid may = not work on Lists. Digged deeper after reading your response, and found = that the @Valid annotation resulted in a call to equals method on the = entity, which had a bug, resulting in the exception. It all works well = after fixing the bug. > > > _______________________________________________ > Engine-devel mailing list > Engine-devel(a)ovirt.org > http://lists.ovirt.org/mailman/listinfo/engine-devel --------------000503030108060803000801 Content-Type: text/html; charset=3DISO-8859-1 Content-Transfer-Encoding: 7bit On Sunday 15 April 2012 11:31 AM, Roy Golan wrote:
On 04/12/2012 10:50 AM, Omer Frenkel wrote:



From: "Shireesh Anjal" <sanjal(a)redhat.com&g= t;
To: engine-devel(a)ovirt= .org
Sent: Thursday, April 12, 2012 9:35:25 AM
Subject: [Engine-devel] Query regarding ValidationUtils#validateInputs

Hi,

This is regarding the following validation method we have in ValidationUtils:

public static <T extends VdcActionParametersBase> ArrayList<String> validateInputs(List<Class<?>> validationGroupList, T parameters);

I there any particular reason for supporting the validations only on objects of classes derived from VdcActionParametersBase? I guess this was done because this method is primarily intended to validate the action parameters passed to a BLL action, using the validation annotations on the parameter class. However I think this method can be useful for general use as well. e.g. I cannot add a "@Valid" annotation on a "list" or a "map" in a parameter class. So I need to iterate over the list/map, and validate each element inside the loop. The validation inside the loop can also utilize the above method if the restriction "extends VdcActionParametersBase" is removed. This will allow me to do the following in the canDoAction method:

protected boolean canDoAction() {
...
    for(GlusterBrickEntity brick : getParameters().getGlusterVolume().getBricks()) {
        List<String> errors= =3D ValidationUtils.validateInputs(getValidationGroups(), brick);
        if(errors !=3D null) {
          &nb= sp; for(String error : errors) {
          &nb= sp;     addCanDoActionMessage(error);
          &nb= sp; }
        }
    }
...
}

Regards,
Shireesh

_______________________________________________
Engine-devel mailing list
Engine-devel(a)ovirt= .org
http://lists.ovirt.org/mailman/listinfo/engine-devel
i don't think there is a reason to restrict only for VdcActionParametersBase, roy what do you think?

also you can use here
getReturnValue().getCanDoActionMessages().addAll(errors);
instead of going over on all errors.

pls see SetupNetworksParameters.java for validating a list of network interfaces.

hibernate validator supports trivial object graphs and members that are arrays, list and java.util.map implementations.
If your code looks like that it should work. If you are using special validation groups please add them to your command with addValidationGroups.

this should work:

GlusterCommandParameters.java
 @Valid
 List<Bricks> bricks

 Bricks.java
 @NotNull
 Guid id

Thanks! I had tried adding @Valid annotation as suggested above, which had resulted in an exception from the validation engine, without any specific information about the problem, and I assumed that @Valid may not work on Lists. Digged deeper after reading your response, and found that the @Valid annotation resulted in a call to equals method on the entity, which had a bug, resulting in the exception. It all works well after fixing the bug.

<= br>

_______________________________________________
Engine-devel mailing list
Engine-devel(a)ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-devel<=
/a>

--------------000503030108060803000801-- --===============3155447487424163763== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" VGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KLS0tLS0tLS0tLS0t LS0wMDA1MDMwMzAxMDgwNjA4MDMwMDA4MDEKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy c2V0PUlTTy04ODU5LTE7IGZvcm1hdD1mbG93ZWQKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog N2JpdAoKT24gU3VuZGF5IDE1IEFwcmlsIDIwMTIgMTE6MzEgQU0sIFJveSBHb2xhbiB3cm90ZToK PiBPbiAwNC8xMi8yMDEyIDEwOjUwIEFNLCBPbWVyIEZyZW5rZWwgd3JvdGU6Cj4+Cj4+Cj4+IC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQo+Pgo+PiAgICAgKkZyb206ICoiU2hpcmVlc2ggQW5qYWwiIDxzYW5qYWxA cmVkaGF0LmNvbT4KPj4gICAgICpUbzogKmVuZ2luZS1kZXZlbEBvdmlydC5vcmcKPj4gICAgICpT ZW50OiAqVGh1cnNkYXksIEFwcmlsIDEyLCAyMDEyIDk6MzU6MjUgQU0KPj4gICAgICpTdWJqZWN0 OiAqW0VuZ2luZS1kZXZlbF0gUXVlcnkgcmVnYXJkaW5nCj4+ICAgICBWYWxpZGF0aW9uVXRpbHMj dmFsaWRhdGVJbnB1dHMKPj4KPj4gICAgIEhpLAo+Pgo+PiAgICAgVGhpcyBpcyByZWdhcmRpbmcg dGhlIGZvbGxvd2luZyB2YWxpZGF0aW9uIG1ldGhvZCB3ZSBoYXZlIGluCj4+ICAgICBWYWxpZGF0 aW9uVXRpbHM6Cj4+Cj4+ICAgICAvcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIFZkY0FjdGlvblBh cmFtZXRlcnNCYXNlPgo+PiAgICAgQXJyYXlMaXN0PFN0cmluZz4gdmFsaWRhdGVJbnB1dHMoTGlz dDxDbGFzczw/Pj4KPj4gICAgIHZhbGlkYXRpb25Hcm91cExpc3QsIFQgcGFyYW1ldGVycyk7Lwo+ Pgo+PiAgICAgSSB0aGVyZSBhbnkgcGFydGljdWxhciByZWFzb24gZm9yIHN1cHBvcnRpbmcgdGhl IHZhbGlkYXRpb25zIG9ubHkKPj4gICAgIG9uIG9iamVjdHMgb2YgY2xhc3NlcyBkZXJpdmVkIGZy b20gVmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2U/IEkKPj4gICAgIGd1ZXNzIHRoaXMgd2FzIGRvbmUg YmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8KPj4gICAgIHZhbGlk YXRlIHRoZSBhY3Rpb24gcGFyYW1ldGVycyBwYXNzZWQgdG8gYSBCTEwgYWN0aW9uLCB1c2luZyB0 aGUKPj4gICAgIHZhbGlkYXRpb24gYW5ub3RhdGlvbnMgb24gdGhlIHBhcmFtZXRlciBjbGFzcy4g SG93ZXZlciBJIHRoaW5rCj4+ICAgICB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZnVsIGZvciBnZW5l cmFsIHVzZSBhcyB3ZWxsLiBlLmcuIEkgY2Fubm90Cj4+ICAgICBhZGQgYSAiQFZhbGlkIiBhbm5v dGF0aW9uIG9uIGEgImxpc3QiIG9yIGEgIm1hcCIgaW4gYSBwYXJhbWV0ZXIKPj4gICAgIGNsYXNz LiBTbyBJIG5lZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBsaXN0L21hcCwgYW5kIHZhbGlkYXRlIGVh Y2gKPj4gICAgIGVsZW1lbnQgaW5zaWRlIHRoZSBsb29wLiBUaGUgdmFsaWRhdGlvbiBpbnNpZGUg dGhlIGxvb3AgY2FuIGFsc28KPj4gICAgIHV0aWxpemUgdGhlIGFib3ZlIG1ldGhvZCBpZiB0aGUg cmVzdHJpY3Rpb24gImV4dGVuZHMKPj4gICAgIFZkY0FjdGlvblBhcmFtZXRlcnNCYXNlIiBpcyBy ZW1vdmVkLiBUaGlzIHdpbGwgYWxsb3cgbWUgdG8gZG8gdGhlCj4+ICAgICBmb2xsb3dpbmcgaW4g dGhlIGNhbkRvQWN0aW9uIG1ldGhvZDoKPj4KPj4gICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkRv QWN0aW9uKCkgewo+PiAgICAgLi4uCj4+ICAgICAgICAgZm9yKEdsdXN0ZXJCcmlja0VudGl0eSBi cmljayA6Cj4+ICAgICBnZXRQYXJhbWV0ZXJzKCkuZ2V0R2x1c3RlclZvbHVtZSgpLmdldEJyaWNr cygpKSB7Cj4+ICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBlcnJvcnMgPQo+PiAgICAgVmFsaWRh dGlvblV0aWxzLnZhbGlkYXRlSW5wdXRzKGdldFZhbGlkYXRpb25Hcm91cHMoKSwgYnJpY2spOwo+ PiAgICAgICAgICAgICBpZihlcnJvcnMgIT0gbnVsbCkgewo+PiAgICAgICAgICAgICAgICAgZm9y KFN0cmluZyBlcnJvciA6IGVycm9ycykgewo+PiAgICAgICAgICAgICAgICAgICAgIGFkZENhbkRv QWN0aW9uTWVzc2FnZShlcnJvcik7Cj4+ICAgICAgICAgICAgICAgICB9Cj4+ICAgICAgICAgICAg IH0KPj4gICAgICAgICB9Cj4+ICAgICAuLi4KPj4gICAgIH0KPj4KPj4gICAgIFJlZ2FyZHMsCj4+ ICAgICBTaGlyZWVzaAo+Pgo+PiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KPj4gICAgIEVuZ2luZS1kZXZlbCBtYWlsaW5nIGxpc3QKPj4gICAgIEVu Z2luZS1kZXZlbEBvdmlydC5vcmcKPj4gICAgIGh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFpbG1h bi9saXN0aW5mby9lbmdpbmUtZGV2ZWwKPj4KPj4gaSBkb24ndCB0aGluayB0aGVyZSBpcyBhIHJl YXNvbiB0byByZXN0cmljdCBvbmx5IGZvciAKPj4gVmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2UsIHJv eSB3aGF0IGRvIHlvdSB0aGluaz8KPj4KPj4gYWxzbyB5b3UgY2FuIHVzZSBoZXJlCj4+IGdldFJl dHVyblZhbHVlKCkuZ2V0Q2FuRG9BY3Rpb25NZXNzYWdlcygpLmFkZEFsbChlcnJvcnMpOwo+PiBp bnN0ZWFkIG9mIGdvaW5nIG92ZXIgb24gYWxsIGVycm9ycy4KPgo+IHBscyBzZWUgU2V0dXBOZXR3 b3Jrc1BhcmFtZXRlcnMuamF2YSBmb3IgdmFsaWRhdGluZyBhIGxpc3Qgb2YgbmV0d29yayAKPiBp bnRlcmZhY2VzLgo+Cj4gaGliZXJuYXRlIHZhbGlkYXRvciBzdXBwb3J0cyB0cml2aWFsIG9iamVj dCBncmFwaHMgYW5kIG1lbWJlcnMgdGhhdCAKPiBhcmUgYXJyYXlzLCBsaXN0IGFuZCBqYXZhLnV0 aWwubWFwIGltcGxlbWVudGF0aW9ucy4KPiBJZiB5b3VyIGNvZGUgbG9va3MgbGlrZSB0aGF0IGl0 IHNob3VsZCB3b3JrLiBJZiB5b3UgYXJlIHVzaW5nIHNwZWNpYWwgCj4gdmFsaWRhdGlvbiBncm91 cHMgcGxlYXNlIGFkZCB0aGVtIHRvIHlvdXIgY29tbWFuZCB3aXRoIAo+IGFkZFZhbGlkYXRpb25H cm91cHMuCj4KPiB0aGlzIHNob3VsZCB3b3JrOgo+Cj4gR2x1c3RlckNvbW1hbmRQYXJhbWV0ZXJz LmphdmEKPiAgQFZhbGlkCj4gIExpc3Q8QnJpY2tzPiBicmlja3MKPgo+ICBCcmlja3MuamF2YQo+ ICBATm90TnVsbAo+ICBHdWlkIGlkCgpUaGFua3MhIEkgaGFkIHRyaWVkIGFkZGluZyBAVmFsaWQg YW5ub3RhdGlvbiBhcyBzdWdnZXN0ZWQgYWJvdmUsIHdoaWNoIApoYWQgcmVzdWx0ZWQgaW4gYW4g ZXhjZXB0aW9uIGZyb20gdGhlIHZhbGlkYXRpb24gZW5naW5lLCB3aXRob3V0IGFueSAKc3BlY2lm aWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2JsZW0sIGFuZCBJIGFzc3VtZWQgdGhhdCBAVmFs aWQgbWF5IApub3Qgd29yayBvbiBMaXN0cy4gRGlnZ2VkIGRlZXBlciBhZnRlciByZWFkaW5nIHlv dXIgcmVzcG9uc2UsIGFuZCBmb3VuZCAKdGhhdCB0aGUgQFZhbGlkIGFubm90YXRpb24gcmVzdWx0 ZWQgaW4gYSBjYWxsIHRvIGVxdWFscyBtZXRob2Qgb24gdGhlIAplbnRpdHksIHdoaWNoIGhhZCBh IGJ1ZywgcmVzdWx0aW5nIGluIHRoZSBleGNlcHRpb24uIEl0IGFsbCB3b3JrcyB3ZWxsIAphZnRl ciBmaXhpbmcgdGhlIGJ1Zy4KCj4KPgo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCj4gRW5naW5lLWRldmVsIG1haWxpbmcgbGlzdAo+IEVuZ2luZS1kZXZl bEBvdmlydC5vcmcKPiBodHRwOi8vbGlzdHMub3ZpcnQub3JnL21haWxtYW4vbGlzdGluZm8vZW5n aW5lLWRldmVsCgoKLS0tLS0tLS0tLS0tLS0wMDA1MDMwMzAxMDgwNjA4MDMwMDA4MDEKQ29udGVu dC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMQpDb250ZW50LVRyYW5zZmVyLUVu Y29kaW5nOiA3Yml0Cgo8aHRtbD4KICA8aGVhZD4KICAgIDxtZXRhIGNvbnRlbnQ9InRleHQvaHRt bDsgY2hhcnNldD1JU08tODg1OS0xIgogICAgICBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiPgog IDwvaGVhZD4KICA8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIj4KICAgIE9u IFN1bmRheSAxNSBBcHJpbCAyMDEyIDExOjMxIEFNLCBSb3kgR29sYW4gd3JvdGU6CiAgICA8Ymxv Y2txdW90ZSBjaXRlPSJtaWQ6NEY4QTY0M0MuODA2MDYwNUByZWRoYXQuY29tIiB0eXBlPSJjaXRl Ij4KICAgICAgPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiCiAg ICAgICAgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIj4KICAgICAgT24gMDQvMTIvMjAxMiAxMDo1 MCBBTSwgT21lciBGcmVua2VsIHdyb3RlOgogICAgICA8YmxvY2txdW90ZQpjaXRlPSJtaWQ6MTVh NTMyOWMtNDU3OS00ZWY2LWIxYzgtYmUwYjI2MGU4NTliQHptYWlsMDcuY29sbGFiLnByb2QuaW50 LnBoeDIucmVkaGF0LmNvbSIKICAgICAgICB0eXBlPSJjaXRlIj4KICAgICAgICA8c3R5bGUgdHlw ZT0idGV4dC9jc3MiPnAgeyBtYXJnaW46IDA7IH08L3N0eWxlPgogICAgICAgIDxkaXYgc3R5bGU9 ImZvbnQtZmFtaWx5OiBUaW1lcyBOZXcgUm9tYW47IGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICAg IGNvbG9yOiAjMDAwMDAwIj48YnI+CiAgICAgICAgICA8YnI+CiAgICAgICAgICA8aHIgaWQ9Inp3 Y2hyIj4KICAgICAgICAgIDxibG9ja3F1b3RlIHN0eWxlPSJib3JkZXItbGVmdDoycHggc29saWQg cmdiKDE2LCAxNiwKMjU1KTttYXJnaW4tbGVmdDo1cHg7cGFkZGluZy1sZWZ0OjVweDtjb2xvcjoj MDAwO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWRlY29yYXRpb246 bm9uZTtmb250LWZhbWlseTpIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTJw dDsiPjxiPkZyb206CgogICAgICAgICAgICA8L2I+IlNoaXJlZXNoIEFuamFsIiA8YSBtb3otZG8t bm90LXNlbmQ9InRydWUiCiAgICAgICAgICAgICAgY2xhc3M9Im1vei10eHQtbGluay1yZmMyMzk2 RSIKICAgICAgICAgICAgICBocmVmPSJtYWlsdG86c2FuamFsQHJlZGhhdC5jb20iPiZsdDtzYW5q YWxAcmVkaGF0LmNvbSZndDs8L2E+PGJyPgogICAgICAgICAgICA8Yj5UbzogPC9iPjxhIG1vei1k by1ub3Qtc2VuZD0idHJ1ZSIKICAgICAgICAgICAgICBjbGFzcz0ibW96LXR4dC1saW5rLWFiYnJl dmlhdGVkIgogICAgICAgICAgICAgIGhyZWY9Im1haWx0bzplbmdpbmUtZGV2ZWxAb3ZpcnQub3Jn Ij5lbmdpbmUtZGV2ZWxAb3ZpcnQub3JnPC9hPjxicj4KICAgICAgICAgICAgPGI+U2VudDogPC9i PlRodXJzZGF5LCBBcHJpbCAxMiwgMjAxMiA5OjM1OjI1IEFNPGJyPgogICAgICAgICAgICA8Yj5T dWJqZWN0OiA8L2I+W0VuZ2luZS1kZXZlbF0gUXVlcnkgcmVnYXJkaW5nCiAgICAgICAgICAgIFZh bGlkYXRpb25VdGlscyN2YWxpZGF0ZUlucHV0czxicj4KICAgICAgICAgICAgPGJyPgogICAgICAg ICAgICBIaSw8YnI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgVGhpcyBpcyByZWdhcmRp bmcgdGhlIGZvbGxvd2luZyB2YWxpZGF0aW9uIG1ldGhvZCB3ZSBoYXZlIGluCiAgICAgICAgICAg IFZhbGlkYXRpb25VdGlsczo8YnI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGk+cHVi bGljIHN0YXRpYyAmbHQ7VCBleHRlbmRzIFZkY0FjdGlvblBhcmFtZXRlcnNCYXNlJmd0OwogICAg ICAgICAgICAgIEFycmF5TGlzdCZsdDtTdHJpbmcmZ3Q7CiAgICAgICAgICAgICAgdmFsaWRhdGVJ bnB1dHMoTGlzdCZsdDtDbGFzcyZsdDs/Jmd0OyZndDsKICAgICAgICAgICAgICB2YWxpZGF0aW9u R3JvdXBMaXN0LCBUIHBhcmFtZXRlcnMpOzwvaT48YnI+CiAgICAgICAgICAgIDxicj4KICAgICAg ICAgICAgSSB0aGVyZSBhbnkgcGFydGljdWxhciByZWFzb24gZm9yIHN1cHBvcnRpbmcgdGhlIHZh bGlkYXRpb25zCiAgICAgICAgICAgIG9ubHkgb24gb2JqZWN0cyBvZiBjbGFzc2VzIGRlcml2ZWQg ZnJvbQogICAgICAgICAgICBWZGNBY3Rpb25QYXJhbWV0ZXJzQmFzZT8gSSBndWVzcyB0aGlzIHdh cyBkb25lIGJlY2F1c2UgdGhpcwogICAgICAgICAgICBtZXRob2QgaXMgcHJpbWFyaWx5IGludGVu ZGVkIHRvIHZhbGlkYXRlIHRoZSBhY3Rpb24KICAgICAgICAgICAgcGFyYW1ldGVycyBwYXNzZWQg dG8gYSBCTEwgYWN0aW9uLCB1c2luZyB0aGUgdmFsaWRhdGlvbgogICAgICAgICAgICBhbm5vdGF0 aW9ucyBvbiB0aGUgcGFyYW1ldGVyIGNsYXNzLiBIb3dldmVyIEkgdGhpbmsgdGhpcwogICAgICAg ICAgICBtZXRob2QgY2FuIGJlIHVzZWZ1bCBmb3IgZ2VuZXJhbCB1c2UgYXMgd2VsbC4gZS5nLiBJ IGNhbm5vdAogICAgICAgICAgICBhZGQgYSAiQFZhbGlkIiBhbm5vdGF0aW9uIG9uIGEgImxpc3Qi IG9yIGEgIm1hcCIgaW4gYQogICAgICAgICAgICBwYXJhbWV0ZXIgY2xhc3MuIFNvIEkgbmVlZCB0 byBpdGVyYXRlIG92ZXIgdGhlIGxpc3QvbWFwLCBhbmQKICAgICAgICAgICAgdmFsaWRhdGUgZWFj aCBlbGVtZW50IGluc2lkZSB0aGUgbG9vcC4gVGhlIHZhbGlkYXRpb24gaW5zaWRlCiAgICAgICAg ICAgIHRoZSBsb29wIGNhbiBhbHNvIHV0aWxpemUgdGhlIGFib3ZlIG1ldGhvZCBpZiB0aGUKICAg ICAgICAgICAgcmVzdHJpY3Rpb24gImV4dGVuZHMgVmRjQWN0aW9uUGFyYW1ldGVyc0Jhc2UiIGlz IHJlbW92ZWQuCiAgICAgICAgICAgIFRoaXMgd2lsbCBhbGxvdyBtZSB0byBkbyB0aGUgZm9sbG93 aW5nIGluIHRoZSBjYW5Eb0FjdGlvbgogICAgICAgICAgICBtZXRob2Q6PGJyPgogICAgICAgICAg ICA8YnI+CiAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkRvQWN0aW9uKCkgezxicj4K ICAgICAgICAgICAgLi4uPGJyPgogICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgZm9yKEds dXN0ZXJCcmlja0VudGl0eSBicmljayA6CiAgICAgICAgICAgIGdldFBhcmFtZXRlcnMoKS5nZXRH bHVzdGVyVm9sdW1lKCkuZ2V0QnJpY2tzKCkpIHs8YnI+CiAgICAgICAgICAgICZuYnNwOyZuYnNw OyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsgTGlzdCZsdDtTdHJpbmcmZ3Q7IGVycm9ycyA9CiAg ICAgICAgICAgIFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUlucHV0cyhnZXRWYWxpZGF0aW9uR3Jv dXBzKCksCiAgICAgICAgICAgIGJyaWNrKTs8YnI+CiAgICAgICAgICAgICZuYnNwOyZuYnNwOyZu YnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsgaWYoZXJyb3JzICE9IG51bGwpIHs8YnI+CiAgICAgICAg ICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyBmb3IoU3RyaW5nIGVycm9yIDogZXJyb3JzKSB7PGJyPgogICAgICAgICAg ICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgYWRkQ2FuRG9BY3Rpb25NZXNzYWdl KGVycm9yKTs8YnI+CiAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9PGJyPgogICAgICAgICAgICAmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KICAgICAgICAgICAg Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+CiAgICAgICAgICAgIC4uLjxicj4KICAgICAgICAgICAg fTxicj4KICAgICAgICAgICAgPGJyPgogICAgICAgICAgICBSZWdhcmRzLDxicj4KICAgICAgICAg ICAgU2hpcmVlc2g8YnI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX188YnI+CiAgICAgICAgICAgIEVuZ2lu ZS1kZXZlbCBtYWlsaW5nIGxpc3Q8YnI+CiAgICAgICAgICAgIDxhIG1vei1kby1ub3Qtc2VuZD0i dHJ1ZSIgY2xhc3M9Im1vei10eHQtbGluay1hYmJyZXZpYXRlZCIKICAgICAgICAgICAgICBocmVm PSJtYWlsdG86RW5naW5lLWRldmVsQG92aXJ0Lm9yZyI+RW5naW5lLWRldmVsQG92aXJ0Lm9yZzwv YT48YnI+CiAgICAgICAgICAgIDxhIG1vei1kby1ub3Qtc2VuZD0idHJ1ZSIgY2xhc3M9Im1vei10 eHQtbGluay1mcmVldGV4dCIKICAgICAgICAgICAgICBocmVmPSJodHRwOi8vbGlzdHMub3ZpcnQu b3JnL21haWxtYW4vbGlzdGluZm8vZW5naW5lLWRldmVsIj5odHRwOi8vbGlzdHMub3ZpcnQub3Jn L21haWxtYW4vbGlzdGluZm8vZW5naW5lLWRldmVsPC9hPjxicj4KICAgICAgICAgIDwvYmxvY2tx dW90ZT4KICAgICAgICAgIGkgZG9uJ3QgdGhpbmsgdGhlcmUgaXMgYSByZWFzb24gdG8gcmVzdHJp Y3Qgb25seSBmb3IKICAgICAgICAgIFZkY0FjdGlvblBhcmFtZXRlcnNCYXNlLCByb3kgd2hhdCBk byB5b3UgdGhpbms/PGJyPgogICAgICAgICAgPGJyPgogICAgICAgICAgYWxzbyB5b3UgY2FuIHVz ZSBoZXJlPGJyPgogICAgICAgICAgZ2V0UmV0dXJuVmFsdWUoKS5nZXRDYW5Eb0FjdGlvbk1lc3Nh Z2VzKCkuYWRkQWxsKGVycm9ycyk7PGJyPgogICAgICAgICAgaW5zdGVhZCBvZiBnb2luZyBvdmVy IG9uIGFsbCBlcnJvcnMuPGJyPgogICAgICAgIDwvZGl2PgogICAgICA8L2Jsb2NrcXVvdGU+CiAg ICAgIDxicj4KICAgICAgcGxzIHNlZSBTZXR1cE5ldHdvcmtzUGFyYW1ldGVycy5qYXZhIGZvciB2 YWxpZGF0aW5nIGEgbGlzdCBvZgogICAgICBuZXR3b3JrIGludGVyZmFjZXMuPGJyPgogICAgICA8 YnI+CiAgICAgIGhpYmVybmF0ZSB2YWxpZGF0b3Igc3VwcG9ydHMgdHJpdmlhbCBvYmplY3QgZ3Jh cGhzIGFuZCBtZW1iZXJzCiAgICAgIHRoYXQgYXJlIGFycmF5cywgbGlzdCBhbmQgamF2YS51dGls Lm1hcCBpbXBsZW1lbnRhdGlvbnMuPGJyPgogICAgICBJZiB5b3VyIGNvZGUgbG9va3MgbGlrZSB0 aGF0IGl0IHNob3VsZCB3b3JrLiBJZiB5b3UgYXJlIHVzaW5nCiAgICAgIHNwZWNpYWwgdmFsaWRh dGlvbiBncm91cHMgcGxlYXNlIGFkZCB0aGVtIHRvIHlvdXIgY29tbWFuZCB3aXRoCiAgICAgIGFk ZFZhbGlkYXRpb25Hcm91cHMuPGJyPgogICAgICA8YnI+CiAgICAgIHRoaXMgc2hvdWxkIHdvcms6 PGJyPgogICAgICA8YnI+CiAgICAgIEdsdXN0ZXJDb21tYW5kUGFyYW1ldGVycy5qYXZhPGJyPgog ICAgICAmbmJzcDtAVmFsaWQ8YnI+CiAgICAgICZuYnNwO0xpc3QmbHQ7QnJpY2tzJmd0OyBicmlj a3M8YnI+CiAgICAgIDxicj4KICAgICAgJm5ic3A7QnJpY2tzLmphdmE8YnI+CiAgICAgICZuYnNw O0BOb3ROdWxsPGJyPgogICAgICAmbmJzcDtHdWlkIGlkPGJyPgogICAgPC9ibG9ja3F1b3RlPgog ICAgPGJyPgogICAgVGhhbmtzISBJIGhhZCB0cmllZCBhZGRpbmcgQFZhbGlkIGFubm90YXRpb24g YXMgc3VnZ2VzdGVkIGFib3ZlLAogICAgd2hpY2ggaGFkIHJlc3VsdGVkIGluIGFuIGV4Y2VwdGlv biBmcm9tIHRoZSB2YWxpZGF0aW9uIGVuZ2luZSwKICAgIHdpdGhvdXQgYW55IHNwZWNpZmljIGlu Zm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ibGVtLCBhbmQgSSBhc3N1bWVkCiAgICB0aGF0IEBWYWxp ZCBtYXkgbm90IHdvcmsgb24gTGlzdHMuIERpZ2dlZCBkZWVwZXIgYWZ0ZXIgcmVhZGluZyB5b3Vy CiAgICByZXNwb25zZSwgYW5kIGZvdW5kIHRoYXQgdGhlIEBWYWxpZCBhbm5vdGF0aW9uIHJlc3Vs dGVkIGluIGEgY2FsbCB0bwogICAgZXF1YWxzIG1ldGhvZCBvbiB0aGUgZW50aXR5LCB3aGljaCBo YWQgYSBidWcsIHJlc3VsdGluZyBpbiB0aGUKICAgIGV4Y2VwdGlvbi4gSXQgYWxsIHdvcmtzIHdl bGwgYWZ0ZXIgZml4aW5nIHRoZSBidWcuPGJyPgogICAgPGJyPgogICAgPGJsb2NrcXVvdGUgY2l0 ZT0ibWlkOjRGOEE2NDNDLjgwNjA2MDVAcmVkaGF0LmNvbSIgdHlwZT0iY2l0ZSI+IDxicj4KICAg ICAgPGZpZWxkc2V0IGNsYXNzPSJtaW1lQXR0YWNobWVudEhlYWRlciI+PC9maWVsZHNldD4KICAg ICAgPGJyPgogICAgICA8cHJlIHdyYXA9IiI+X19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KRW5naW5lLWRldmVsIG1haWxpbmcgbGlzdAo8YSBjbGFzcz0ibW96 LXR4dC1saW5rLWFiYnJldmlhdGVkIiBocmVmPSJtYWlsdG86RW5naW5lLWRldmVsQG92aXJ0Lm9y ZyI+RW5naW5lLWRldmVsQG92aXJ0Lm9yZzwvYT4KPGEgY2xhc3M9Im1vei10eHQtbGluay1mcmVl dGV4dCIgaHJlZj0iaHR0cDovL2xpc3RzLm92aXJ0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2VuZ2lu ZS1kZXZlbCI+aHR0cDovL2xpc3RzLm92aXJ0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2VuZ2luZS1k ZXZlbDwvYT4KPC9wcmU+CiAgICA8L2Jsb2NrcXVvdGU+CiAgICA8YnI+CiAgPC9ib2R5Pgo8L2h0 bWw+CgotLS0tLS0tLS0tLS0tLTAwMDUwMzAzMDEwODA2MDgwMzAwMDgwMS0tCg== --===============3155447487424163763==--