Differences
This shows you the differences between two versions of the page.
tutorial:validation_process [2020/04/16 10:56] |
tutorial:validation_process [2020/04/16 10:56] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ==== Principles ==== | ||
+ | The validation process is totally integrated to the editor. | ||
+ | * You cannot save an editor when a validation error is encountered.. | ||
+ | * When displaying, modifying, saving data, the validation process is triggered. | ||
+ | To illustrate this issue, choose in the menu the option <wrap adicode>Film / Create Film</wrap>:\\ \\ | ||
+ | You can see that you obtain 2 errors corresponding to 2 mandatory fields. Each time you give a value in a field, an error is removed. | ||
+ | <columns 100% l 500px middle> | ||
+ | {{:features:new_film.jpg?500 |Launch query}} | ||
+ | <newcolumn> | ||
+ | In fact, the attribute <wrap adicode>mandatory="true"</wrap> of fields <wrap adicode>title, languageByLanguageId </wrap> is transformed as a validator during the generation process of UI classes.\\ \\ | ||
+ | So, 2 errors occur when asking for a new Film record and you must fulfill these fields.\\ \\ | ||
+ | Validators is a way to control data when there are displayed or seized.\\ | ||
+ | There are two kinds of Validator: | ||
+ | * XML written Validators. All the code needed for the validator is written in the XML file. | ||
+ | * Validators calling a validator class: Create a Java class which implements interface <wrap adicode>org.adichatz.engine.validation.IValidator and reference it in the XML file.</wrap> | ||
+ | </columns> | ||
+ | \\ | ||
+ | |||
+ | |||
+ | |||
+ | ==== Adding validator in XML file ==== | ||
+ | For example, open file <wrap adicode>$projectDirectory/resources/xml/include/detail/FilmDIGENERATED.xml with XML editor.</wrap> | ||
+ | Change element: | ||
+ | <sxh xml; title: excerpt from 'FilmDI.axml' file.> | ||
+ | <text textLimit="255" property="description" layoutData="span 3" id="description"/> | ||
+ | </sxh> | ||
+ | by: | ||
+ | <sxh xml; highlight: [2,3,4,5,6,7]; title: excerpt from 'FilmDI.axml' file.> | ||
+ | <text layoutData="span 3" property="description" id="description"> | ||
+ | <validators> | ||
+ | <validator key="titleLength" errorMessage="Description should not be null" warningMessage="Description generally has more than 10 characters."> | ||
+ | <warningWhen>return ((String) getValue()).length() < 11;</warningWhen> | ||
+ | <errorWhen>return null == getValue() || 0 == ((String) getValue()).trim().length();</errorWhen> | ||
+ | </validator> | ||
+ | </validators> | ||
+ | </text> | ||
+ | </sxh> | ||
+ | <WRAP adihi>A validator has just been created that: | ||
+ | * triggers an error if the description field contains only blank characters or is a null string. | ||
+ | * triggers a warning (not blocking) when description text contains less than 11 characters. | ||
+ | </WRAP>\\ | ||
+ | ==== Using a pre-defined validator class ==== | ||
+ | Some validator could be complex or could be used in several xml files. For that, a better way is to use a predefined validator class. Syntax is: | ||
+ | <sxh xml; highlight: [7]; title: excerpt from 'FilmDI.axml' file.> | ||
+ | <text property="description" layoutData="span 3" id="description"> | ||
+ | <validators> | ||
+ | <validator key="titleLength" errorMessage="Description should not be null" warningMessage="Description generally has more than 10 characters."> | ||
+ | <errorWhen>return null == getValue() || 0 == ((String) getValue()).trim().length();</errorWhen> | ||
+ | <warningWhen>return ((String) getValue()).length() < 11;</warningWhen> | ||
+ | </validator> | ||
+ | <validator key="alphaNumeric" validatorClassName="org.mycompany.myproject.gencode.custom.TitleValidator"/> | ||
+ | </validators> | ||
+ | </text> | ||
+ | </sxh> | ||
+ | The <wrap adicode>TitleValidator</wrap> class must extends the class <wrap adicode>org.adichatz.engine.validation.AValidator</wrap>. | ||
+ | If you create the class in a subpackage of org.adichatz.gencode in source folder resources/gencode/src, you will not have to close and relaunch the application because these classes are dynamically loaded. To create the class, use the Eclipse IDE from which you launched the application. | ||
+ | Code could be like this: | ||
+ | <sxh java> | ||
+ | package org.mycompany.myproject.gencode.custom; | ||
+ | |||
+ | import java.util.regex.Pattern; | ||
+ | |||
+ | import org.adichatz.engine.controller.IValidableController; | ||
+ | import org.adichatz.engine.controller.field.TextController; | ||
+ | import org.adichatz.engine.validation.AValidator; | ||
+ | import org.eclipse.jface.dialogs.IMessageProvider; | ||
+ | |||
+ | public class TitleValidator extends AValidator { | ||
+ | |||
+ | public TitleValidator(IValidableController triggeringController, String key) { | ||
+ | super(triggeringController, key); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int validate() { | ||
+ | String title = (String) ((TextController) triggeringController) | ||
+ | .getValue(); | ||
+ | Pattern pattern = Pattern.compile("(\\w| )+"); | ||
+ | if (null != title && !pattern.matcher(title).matches()) { | ||
+ | return setLevel(IMessageProvider.ERROR, | ||
+ | "Only alphanumeric characters are accepted."); | ||
+ | } else | ||
+ | return setLevel(IMessageProvider.NONE, null); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </sxh> | ||
+ | <WRAP adihi>A validator has just been created. The validator triggers an error when the title don't have an alphanumeric value.</WRAP> | ||