Author: tchemit Date: 2011-02-20 12:36:20 +0100 (Sun, 20 Feb 2011) New Revision: 2232 Url: http://nuiton.org/repositories/revision/jaxx/2232 Log: add javadoc for SwingValidatorUtil + improve generation Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/ValidatorFinalizer.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaMethod.java trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorUtil.java Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/ValidatorFinalizer.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/ValidatorFinalizer.java 2011-02-20 11:34:09 UTC (rev 2231) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/ValidatorFinalizer.java 2011-02-20 11:36:20 UTC (rev 2232) @@ -126,7 +126,7 @@ Modifier.PUBLIC, TYPE_VOID, "registerValidatorFields", - validatorUtilPrefix + "installFields(this);", + validatorUtilPrefix + "detectValidatorFields(this);", true) ); builder.append("// register "); @@ -135,7 +135,7 @@ builder.append(eol); builder.append("validatorIds = "); - builder.append(validatorUtilPrefix).append("initUI(this);"); + builder.append(validatorUtilPrefix).append("detectValidators(this);"); builder.append(eol); builder.append(validatorUtilPrefix).append("installUI(this);"); Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaMethod.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaMethod.java 2011-02-20 11:34:09 UTC (rev 2231) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaMethod.java 2011-02-20 11:36:20 UTC (rev 2232) @@ -172,14 +172,21 @@ return methods.contains(method.getName()); } }, - JAXXValidation(Modifier.PUBLIC, "JAXXValidation implementation") { + JAXXValidation(Modifier.PUBLIC, "JAXXValidator implementation") { private final List<String> methods = - Arrays.asList("getValidator", "getValidatorIds"); + Arrays.asList("getValidator", "getValidatorIds", "registerValidatorFields"); @Override public boolean accept(JavaMethod method) { - return methods.contains(method.getName()); + boolean contains = methods.contains(method.getName()); + if (contains && method.getName().equals("getValidator")) { + // only accept the method getValidator(String) and not anything else... + // since user can have a validator field which is a validator, but not part of the + // JAXXValidatator contract + return method.getArguments().length==1; + } + return contains; } }, events(Modifier.PUBLIC, "Event methods") { @@ -202,7 +209,7 @@ return method.getName().startsWith("set"); } }, - otherPublic(Modifier.PUBLIC, "Public mutator methods") { + otherPublic(Modifier.PUBLIC, "Other methods") { @Override public boolean accept(int mod) { return super.accept(mod) && !Modifier.isStatic(mod); Modified: trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorUtil.java =================================================================== --- trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorUtil.java 2011-02-20 11:34:09 UTC (rev 2231) +++ trunk/jaxx-validator/src/main/java/jaxx/runtime/validator/swing/SwingValidatorUtil.java 2011-02-20 11:36:20 UTC (rev 2232) @@ -126,7 +126,8 @@ // no instance } - public static <O> SwingValidator<O> newValidator(Class<O> type, String context) { + public static <O> SwingValidator<O> newValidator(Class<O> type, + String context) { if (BeanValidatorFactory.isDefaultCreator()) { @@ -134,11 +135,63 @@ BeanValidatorFactory.setCreator(new DefaultSwingValidatorCreator()); } SwingValidator<O> validator = - (SwingValidator<O>) BeanValidatorFactory.newBeanValidator(type, context); + (SwingValidator<O>) BeanValidatorFactory.newBeanValidator( + type, context); return validator; } - public static List<String> initUI(JAXXValidator ui) { + /** + * To install all the stuff for validation on a {@link JAXXValidator} ui. + * <p/> + * This method is called after validators has beeen detected in the ui (via + * the method {@link #detectValidators(JAXXValidator)}).. + * <p/> + * It will first find and register all validator field via the method + * {@link JAXXValidator#registerValidatorFields()}, then for each + * validators it will install ui for it (says connect validator to ui via layers) + * and will reload attached bean to make visible bean validation state on ui. + * <p/> + * This method is always inovked by a generated jaxx-validator file at the + * end of the {@code $completeSetup} method. + * + * @param ui the validator ui to init. + */ + public static void installUI(JAXXValidator ui) { + + // first install fields with validation + ui.registerValidatorFields(); + +// detectValidatorFields(ui); + + // for each validator install uis + reload bean + + List<String> validatorIds = ui.getValidatorIds(); + for (String validatorId : validatorIds) { + SwingValidator<?> validator = (SwingValidator<?>) + ui.getValidator(validatorId); + + // install uis + validator.installUIs(); + + // reload attached bean (to see validation on uis) + validator.reloadBean(); + } + } + + /** + * Given a {@link JAXXValidator} ui, detects on it all the validators it + * contains. + * <p/> + * A validator is detected from the annotation {@link Validator} placed on + * his field. + * <p/> + * This method is always inovked by a generated jaxx-validator file at the + * end of the {@code $completeSetup} method. + * + * @param ui the ui where to seek for validators. + * @return the list of ids of validators found on the given ui + */ + public static List<String> detectValidators(JAXXValidator ui) { List<String> validatorIds = new ArrayList<String>(); Map<Field, Validator> validators = ReflectUtil.getFieldAnnotation( ui.getClass(), @@ -152,22 +205,41 @@ String validatorId = annotation.validatorId(); validatorIds.add(validatorId); if (log.isInfoEnabled()) { - log.info("Detect validator [" + annotation.validatorId() + "] on field " + field.getName()); + log.info("Detect validator [" + annotation.validatorId() + + "] on field " + field.getName()); } } return Collections.unmodifiableList(validatorIds); } - public static void installFields(JAXXValidator ui) { + /** + * Detects on a {@link JAXXValidator} ui all the validator fields it + * contains. + * <p/> + * A validator field is detected via the annotation placed on his field or + * his getter (in cas of inheritance). + * <p/> + * Each field found will be registred to his corresponding validator via + * the method {@link SwingValidator#setFieldRepresentation(String, JComponent)}. + * <p/> + * By default, this method is invoked in the generated method + * {@link JAXXValidator#registerValidatorFields()} by a generated + * jaxx-validator file. + * + * @param ui the ui to seek + */ + public static void detectValidatorFields(JAXXValidator ui) { Map<JComponent, ValidatorField> editors = getValidatorEditors(ui); try { for (String validatorId : ui.getValidatorIds()) { - SwingValidator<?> validator = (SwingValidator<?>) ui.getValidator(validatorId); + SwingValidator<?> validator = + (SwingValidator<?>) ui.getValidator(validatorId); - for (Map.Entry<JComponent, ValidatorField> entry : editors.entrySet()) { + for (Map.Entry<JComponent, ValidatorField> entry : + editors.entrySet()) { ValidatorField fieldAnnotation = entry.getValue(); JComponent editor = entry.getKey(); if (!validatorId.equals(fieldAnnotation.validatorId())) { @@ -177,11 +249,12 @@ } String propertyName = fieldAnnotation.propertyName(); if (log.isInfoEnabled()) { - log.info("Detects for validator [" + validatorId + "] property " + propertyName + " for editor " + fieldAnnotation.editorName()); + log.info("Detects for validator [" + validatorId + + "] property " + propertyName + + " for editor " + fieldAnnotation.editorName()); } validator.setFieldRepresentation(propertyName, editor); } - } } finally { @@ -190,25 +263,6 @@ } } - public static void installUI(JAXXValidator ui) { - - // first install fields with validation - installFields(ui); - - // for each validator install uis + reload bean - - List<String> validatorIds = ui.getValidatorIds(); - for (String validatorId : validatorIds) { - SwingValidator<?> validator = (SwingValidator<?>) ui.getValidator(validatorId); - - // install uis - validator.installUIs(); - - // reload attached bean (to see validation on uis) - validator.reloadBean(); - } - } - /** * Prepare the ui where to display the validators messages. *