/projects/struts-2.2.1/src/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus · Java · 816 lines · 639 code · 131 blank · 46 comment · 278 complexity · a42c65feebb997fdce589df25a69916a MD5 · raw file

  1. /*
  2. * Copyright 2002-2006,2009 The Apache Software Foundation.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.opensymphony.xwork2.validator;
  17. import com.opensymphony.xwork2.validator.annotations.*;
  18. import java.lang.annotation.Annotation;
  19. import java.lang.reflect.Method;
  20. import java.text.DateFormat;
  21. import java.text.ParseException;
  22. import java.text.SimpleDateFormat;
  23. import java.util.*;
  24. import java.util.regex.Matcher;
  25. import java.util.regex.Pattern;
  26. /**
  27. * <code>AnnotationValidationConfigurationBuilder</code>
  28. *
  29. * @author Rainer Hermanns
  30. * @author jepjep
  31. * @version $Id: AnnotationValidationConfigurationBuilder.java 894090 2009-12-27 18:18:29Z martinc $
  32. */
  33. public class AnnotationValidationConfigurationBuilder {
  34. private static final Pattern SETTER_PATTERN = Pattern.compile("set([A-Z][A-Za-z0-9]*)$");
  35. private static final Pattern GETTER_PATTERN = Pattern.compile("(get|is|has)([A-Z][A-Za-z0-9]*)$");
  36. private ValidatorFactory validatorFactory;
  37. public AnnotationValidationConfigurationBuilder(ValidatorFactory fac) {
  38. this.validatorFactory = fac;
  39. }
  40. private List<ValidatorConfig> processAnnotations(Object o) {
  41. List<ValidatorConfig> result = new ArrayList<ValidatorConfig>();
  42. String fieldName = null;
  43. String methodName = null;
  44. Annotation[] annotations = null;
  45. if (o instanceof Class) {
  46. Class clazz = (Class) o;
  47. annotations = clazz.getAnnotations();
  48. }
  49. if (o instanceof Method) {
  50. Method method = (Method) o;
  51. fieldName = resolvePropertyName(method);
  52. methodName = method.getName();
  53. annotations = method.getAnnotations();
  54. }
  55. if (annotations != null) {
  56. for (Annotation a : annotations) {
  57. // Process collection of custom validations
  58. if (a instanceof Validations) {
  59. processValidationAnnotation(a, fieldName, methodName, result);
  60. }
  61. // Process single custom validator
  62. if (a instanceof Validation) {
  63. Validation v = (Validation) a;
  64. if ( v.validations() != null ) {
  65. for ( Validations val: v.validations()) {
  66. processValidationAnnotation(val , fieldName, methodName, result);
  67. }
  68. }
  69. }
  70. // Process single custom validator
  71. else if (a instanceof ExpressionValidator) {
  72. ExpressionValidator v = (ExpressionValidator) a;
  73. ValidatorConfig temp = processExpressionValidatorAnnotation(v, fieldName, methodName);
  74. if (temp != null) {
  75. result.add(temp);
  76. }
  77. }
  78. // Process single custom validator
  79. else if (a instanceof CustomValidator) {
  80. CustomValidator v = (CustomValidator) a;
  81. ValidatorConfig temp = processCustomValidatorAnnotation(v, fieldName, methodName);
  82. if (temp != null) {
  83. result.add(temp);
  84. }
  85. }
  86. // Process ConversionErrorFieldValidator
  87. else if ( a instanceof ConversionErrorFieldValidator) {
  88. ConversionErrorFieldValidator v = (ConversionErrorFieldValidator) a;
  89. ValidatorConfig temp = processConversionErrorFieldValidatorAnnotation(v, fieldName, methodName);
  90. if ( temp != null) {
  91. result.add(temp);
  92. }
  93. }
  94. // Process DateRangeFieldValidator
  95. else if ( a instanceof DateRangeFieldValidator) {
  96. DateRangeFieldValidator v = (DateRangeFieldValidator) a;
  97. ValidatorConfig temp = processDateRangeFieldValidatorAnnotation(v, fieldName, methodName);
  98. if ( temp != null) {
  99. result.add(temp);
  100. }
  101. }
  102. // Process EmailValidator
  103. else if ( a instanceof EmailValidator) {
  104. EmailValidator v = (EmailValidator) a;
  105. ValidatorConfig temp = processEmailValidatorAnnotation(v, fieldName, methodName);
  106. if ( temp != null) {
  107. result.add(temp);
  108. }
  109. }
  110. // Process FieldExpressionValidator
  111. else if ( a instanceof FieldExpressionValidator) {
  112. FieldExpressionValidator v = (FieldExpressionValidator) a;
  113. ValidatorConfig temp = processFieldExpressionValidatorAnnotation(v, fieldName, methodName);
  114. if ( temp != null) {
  115. result.add(temp);
  116. }
  117. }
  118. // Process IntRangeFieldValidator
  119. else if ( a instanceof IntRangeFieldValidator) {
  120. IntRangeFieldValidator v = (IntRangeFieldValidator) a;
  121. ValidatorConfig temp = processIntRangeFieldValidatorAnnotation(v, fieldName, methodName);
  122. if ( temp != null) {
  123. result.add(temp);
  124. }
  125. }
  126. // Process DoubleRangeFieldValidator
  127. else if ( a instanceof DoubleRangeFieldValidator) {
  128. DoubleRangeFieldValidator v = (DoubleRangeFieldValidator) a;
  129. ValidatorConfig temp = processDoubleRangeFieldValidatorAnnotation(v, fieldName, methodName);
  130. if ( temp != null) {
  131. result.add(temp);
  132. }
  133. }
  134. // Process RequiredFieldValidator
  135. else if ( a instanceof RequiredFieldValidator) {
  136. RequiredFieldValidator v = (RequiredFieldValidator) a;
  137. ValidatorConfig temp = processRequiredFieldValidatorAnnotation(v, fieldName, methodName);
  138. if ( temp != null) {
  139. result.add(temp);
  140. }
  141. }
  142. // Process RequiredStringValidator
  143. else if ( a instanceof RequiredStringValidator) {
  144. RequiredStringValidator v = (RequiredStringValidator) a;
  145. ValidatorConfig temp = processRequiredStringValidatorAnnotation(v, fieldName, methodName);
  146. if ( temp != null) {
  147. result.add(temp);
  148. }
  149. }
  150. // Process StringLengthFieldValidator
  151. else if ( a instanceof StringLengthFieldValidator) {
  152. StringLengthFieldValidator v = (StringLengthFieldValidator) a;
  153. ValidatorConfig temp = processStringLengthFieldValidatorAnnotation(v, fieldName, methodName);
  154. if ( temp != null) {
  155. result.add(temp);
  156. }
  157. }
  158. // Process UrlValidator
  159. else if ( a instanceof UrlValidator) {
  160. UrlValidator v = (UrlValidator) a;
  161. ValidatorConfig temp = processUrlValidatorAnnotation(v, fieldName, methodName);
  162. if ( temp != null) {
  163. result.add(temp);
  164. }
  165. }
  166. // Process ConditionalVisitorFieldValidator
  167. else if ( a instanceof ConditionalVisitorFieldValidator) {
  168. ConditionalVisitorFieldValidator v = (ConditionalVisitorFieldValidator) a;
  169. ValidatorConfig temp = processConditionalVisitorFieldValidatorAnnotation(v, fieldName, methodName);
  170. if ( temp != null) {
  171. result.add(temp);
  172. }
  173. }
  174. // Process VisitorFieldValidator
  175. else if ( a instanceof VisitorFieldValidator) {
  176. VisitorFieldValidator v = (VisitorFieldValidator) a;
  177. ValidatorConfig temp = processVisitorFieldValidatorAnnotation(v, fieldName, methodName);
  178. if ( temp != null) {
  179. result.add(temp);
  180. }
  181. }
  182. // Process RegexFieldValidator
  183. else if ( a instanceof RegexFieldValidator) {
  184. RegexFieldValidator v = (RegexFieldValidator) a;
  185. ValidatorConfig temp = processRegexFieldValidatorAnnotation(v, fieldName, methodName);
  186. if ( temp != null) {
  187. result.add(temp);
  188. }
  189. }
  190. }
  191. }
  192. return result;
  193. }
  194. private void processValidationAnnotation(Annotation a, String fieldName, String methodName, List<ValidatorConfig> result) {
  195. Validations validations = (Validations) a;
  196. CustomValidator[] cv = validations.customValidators();
  197. if ( cv != null ) {
  198. for (CustomValidator v : cv) {
  199. ValidatorConfig temp = processCustomValidatorAnnotation(v, fieldName, methodName);
  200. if (temp != null) {
  201. result.add(temp);
  202. }
  203. }
  204. }
  205. ExpressionValidator[] ev = validations.expressions();
  206. if ( ev != null ) {
  207. for (ExpressionValidator v : ev) {
  208. ValidatorConfig temp = processExpressionValidatorAnnotation(v, fieldName, methodName);
  209. if (temp != null) {
  210. result.add(temp);
  211. }
  212. }
  213. }
  214. ConversionErrorFieldValidator[] cef = validations.conversionErrorFields();
  215. if ( cef != null ) {
  216. for (ConversionErrorFieldValidator v : cef) {
  217. ValidatorConfig temp = processConversionErrorFieldValidatorAnnotation(v, fieldName, methodName);
  218. if (temp != null) {
  219. result.add(temp);
  220. }
  221. }
  222. }
  223. DateRangeFieldValidator[] drfv = validations.dateRangeFields();
  224. if ( drfv != null ) {
  225. for (DateRangeFieldValidator v : drfv) {
  226. ValidatorConfig temp = processDateRangeFieldValidatorAnnotation(v, fieldName, methodName);
  227. if (temp != null) {
  228. result.add(temp);
  229. }
  230. }
  231. }
  232. EmailValidator[] emv = validations.emails();
  233. if ( emv != null ) {
  234. for (EmailValidator v : emv) {
  235. ValidatorConfig temp = processEmailValidatorAnnotation(v, fieldName, methodName);
  236. if (temp != null) {
  237. result.add(temp);
  238. }
  239. }
  240. }
  241. FieldExpressionValidator[] fev = validations.fieldExpressions();
  242. if ( fev != null ) {
  243. for (FieldExpressionValidator v : fev) {
  244. ValidatorConfig temp = processFieldExpressionValidatorAnnotation(v, fieldName, methodName);
  245. if (temp != null) {
  246. result.add(temp);
  247. }
  248. }
  249. }
  250. IntRangeFieldValidator[] irfv = validations.intRangeFields();
  251. if ( irfv != null ) {
  252. for (IntRangeFieldValidator v : irfv) {
  253. ValidatorConfig temp = processIntRangeFieldValidatorAnnotation(v, fieldName, methodName);
  254. if (temp != null) {
  255. result.add(temp);
  256. }
  257. }
  258. }
  259. RegexFieldValidator[] rfv = validations.regexFields();
  260. if ( rfv != null ) {
  261. for (RegexFieldValidator v : rfv) {
  262. ValidatorConfig temp = processRegexFieldValidatorAnnotation(v, fieldName, methodName);
  263. if (temp != null) {
  264. result.add(temp);
  265. }
  266. }
  267. }
  268. RequiredFieldValidator[] rv = validations.requiredFields();
  269. if ( rv != null ) {
  270. for (RequiredFieldValidator v : rv) {
  271. ValidatorConfig temp = processRequiredFieldValidatorAnnotation(v, fieldName, methodName);
  272. if (temp != null) {
  273. result.add(temp);
  274. }
  275. }
  276. }
  277. RequiredStringValidator[] rsv = validations.requiredStrings();
  278. if ( rsv != null ) {
  279. for (RequiredStringValidator v : rsv) {
  280. ValidatorConfig temp = processRequiredStringValidatorAnnotation(v, fieldName, methodName);
  281. if (temp != null) {
  282. result.add(temp);
  283. }
  284. }
  285. }
  286. StringLengthFieldValidator[] slfv = validations.stringLengthFields();
  287. if ( slfv != null ) {
  288. for (StringLengthFieldValidator v : slfv) {
  289. ValidatorConfig temp = processStringLengthFieldValidatorAnnotation(v, fieldName, methodName);
  290. if (temp != null) {
  291. result.add(temp);
  292. }
  293. }
  294. }
  295. UrlValidator[] uv = validations.urls();
  296. if ( uv != null ) {
  297. for (UrlValidator v : uv) {
  298. ValidatorConfig temp = processUrlValidatorAnnotation(v, fieldName, methodName);
  299. if (temp != null) {
  300. result.add(temp);
  301. }
  302. }
  303. }
  304. ConditionalVisitorFieldValidator[] cvfv = validations.conditionalVisitorFields();
  305. if ( cvfv != null ) {
  306. for (ConditionalVisitorFieldValidator v : cvfv) {
  307. ValidatorConfig temp = processConditionalVisitorFieldValidatorAnnotation(v, fieldName, methodName);
  308. if (temp != null) {
  309. result.add(temp);
  310. }
  311. }
  312. }
  313. VisitorFieldValidator[] vfv = validations.visitorFields();
  314. if ( vfv != null ) {
  315. for (VisitorFieldValidator v : vfv) {
  316. ValidatorConfig temp = processVisitorFieldValidatorAnnotation(v, fieldName, methodName);
  317. if (temp != null) {
  318. result.add(temp);
  319. }
  320. }
  321. }
  322. }
  323. private ValidatorConfig processExpressionValidatorAnnotation(ExpressionValidator v, String fieldName, String methodName) {
  324. String validatorType = "expression";
  325. Map<String, String> params = new HashMap<String, String>();
  326. if (fieldName != null) {
  327. params.put("fieldName", fieldName);
  328. }
  329. params.put("expression", v.expression());
  330. validatorFactory.lookupRegisteredValidatorType(validatorType);
  331. return new ValidatorConfig.Builder(validatorType)
  332. .addParams(params)
  333. .addParam("methodName", methodName)
  334. .shortCircuit(v.shortCircuit())
  335. .defaultMessage(v.message())
  336. .messageKey(v.key())
  337. .build();
  338. }
  339. private ValidatorConfig processCustomValidatorAnnotation(CustomValidator v, String fieldName, String methodName) {
  340. Map<String, String> params = new HashMap<String, String>();
  341. if (fieldName != null) {
  342. params.put("fieldName", fieldName);
  343. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  344. params.put("fieldName", v.fieldName());
  345. }
  346. String validatorType = v.type();
  347. validatorFactory.lookupRegisteredValidatorType(validatorType);
  348. Annotation[] recursedAnnotations = v.parameters();
  349. if ( recursedAnnotations != null ) {
  350. for (Annotation a2 : recursedAnnotations) {
  351. if (a2 instanceof ValidationParameter) {
  352. ValidationParameter parameter = (ValidationParameter) a2;
  353. String parameterName = parameter.name();
  354. String parameterValue = parameter.value();
  355. params.put(parameterName, parameterValue);
  356. }
  357. }
  358. }
  359. return new ValidatorConfig.Builder(validatorType)
  360. .addParams(params)
  361. .addParam("methodName", methodName)
  362. .shortCircuit(v.shortCircuit())
  363. .defaultMessage(v.message())
  364. .messageKey(v.key())
  365. .build();
  366. }
  367. private ValidatorConfig processRegexFieldValidatorAnnotation(RegexFieldValidator v, String fieldName, String methodName) {
  368. String validatorType = "regex";
  369. Map<String, String> params = new HashMap<String, String>();
  370. if (fieldName != null) {
  371. params.put("fieldName", fieldName);
  372. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  373. params.put("fieldName", v.fieldName());
  374. }
  375. params.put("expression", v.expression());
  376. validatorFactory.lookupRegisteredValidatorType(validatorType);
  377. return new ValidatorConfig.Builder(validatorType)
  378. .addParams(params)
  379. .addParam("methodName", methodName)
  380. .shortCircuit(v.shortCircuit())
  381. .defaultMessage(v.message())
  382. .messageKey(v.key())
  383. .build();
  384. }
  385. private ValidatorConfig processConditionalVisitorFieldValidatorAnnotation(ConditionalVisitorFieldValidator v, String fieldName, String methodName) {
  386. String validatorType = "conditionalvisitor";
  387. Map<String, String> params = new HashMap<String, String>();
  388. if (fieldName != null) {
  389. params.put("fieldName", fieldName);
  390. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  391. params.put("fieldName", v.fieldName());
  392. }
  393. params.put("expression", v.expression());
  394. params.put("context", v.context());
  395. params.put("appendPrefix", String.valueOf(v.appendPrefix()));
  396. validatorFactory.lookupRegisteredValidatorType(validatorType);
  397. return new ValidatorConfig.Builder(validatorType)
  398. .addParams(params)
  399. .addParam("methodName", methodName)
  400. .shortCircuit(v.shortCircuit())
  401. .defaultMessage(v.message())
  402. .messageKey(v.key())
  403. .build();
  404. }
  405. private ValidatorConfig processVisitorFieldValidatorAnnotation(VisitorFieldValidator v, String fieldName, String methodName) {
  406. String validatorType = "visitor";
  407. Map<String, String> params = new HashMap<String, String>();
  408. if (fieldName != null) {
  409. params.put("fieldName", fieldName);
  410. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  411. params.put("fieldName", v.fieldName());
  412. }
  413. params.put("context", v.context());
  414. params.put("appendPrefix", String.valueOf(v.appendPrefix()));
  415. validatorFactory.lookupRegisteredValidatorType(validatorType);
  416. return new ValidatorConfig.Builder(validatorType)
  417. .addParams(params)
  418. .addParam("methodName", methodName)
  419. .shortCircuit(v.shortCircuit())
  420. .defaultMessage(v.message())
  421. .messageKey(v.key())
  422. .build();
  423. }
  424. private ValidatorConfig processUrlValidatorAnnotation(UrlValidator v, String fieldName, String methodName) {
  425. String validatorType = "url";
  426. Map<String, String> params = new HashMap<String, String>();
  427. if (fieldName != null) {
  428. params.put("fieldName", fieldName);
  429. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  430. params.put("fieldName", v.fieldName());
  431. }
  432. validatorFactory.lookupRegisteredValidatorType(validatorType);
  433. return new ValidatorConfig.Builder(validatorType)
  434. .addParams(params)
  435. .addParam("methodName", methodName)
  436. .shortCircuit(v.shortCircuit())
  437. .defaultMessage(v.message())
  438. .messageKey(v.key())
  439. .build();
  440. }
  441. private ValidatorConfig processStringLengthFieldValidatorAnnotation(StringLengthFieldValidator v, String fieldName, String methodName) {
  442. String validatorType = "stringlength";
  443. Map<String, String> params = new HashMap<String, String>();
  444. if (fieldName != null) {
  445. params.put("fieldName", fieldName);
  446. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  447. params.put("fieldName", v.fieldName());
  448. }
  449. if ( v.maxLength() != null && v.maxLength().length() > 0) {
  450. params.put("maxLength", v.maxLength());
  451. }
  452. if ( v.minLength() != null && v.minLength().length() > 0) {
  453. params.put("minLength", v.minLength());
  454. }
  455. params.put("trim", String.valueOf(v.trim()));
  456. validatorFactory.lookupRegisteredValidatorType(validatorType);
  457. return new ValidatorConfig.Builder(validatorType)
  458. .addParams(params)
  459. .addParam("methodName", methodName)
  460. .shortCircuit(v.shortCircuit())
  461. .defaultMessage(v.message())
  462. .messageKey(v.key())
  463. .build();
  464. }
  465. private Date parseDateString(String value) {
  466. SimpleDateFormat d1 = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG, Locale.getDefault());
  467. SimpleDateFormat d2 = (SimpleDateFormat)DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, Locale.getDefault());
  468. SimpleDateFormat d3 = (SimpleDateFormat)DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.getDefault());
  469. SimpleDateFormat[] dfs = {d1, d2, d3};
  470. DateFormat df = null;
  471. for (SimpleDateFormat df1 : dfs) {
  472. try {
  473. Date check = df1.parse(value);
  474. df = df1;
  475. if (check != null) {
  476. return check;
  477. }
  478. }
  479. catch (ParseException ignore) {
  480. }
  481. }
  482. return null;
  483. }
  484. private ValidatorConfig processRequiredStringValidatorAnnotation(RequiredStringValidator v, String fieldName, String methodName) {
  485. String validatorType = "requiredstring";
  486. Map<String, String> params = new HashMap<String, String>();
  487. if (fieldName != null) {
  488. params.put("fieldName", fieldName);
  489. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  490. params.put("fieldName", v.fieldName());
  491. }
  492. params.put("trim", String.valueOf(v.trim()));
  493. validatorFactory.lookupRegisteredValidatorType(validatorType);
  494. return new ValidatorConfig.Builder(validatorType)
  495. .addParams(params)
  496. .addParam("methodName", methodName)
  497. .shortCircuit(v.shortCircuit())
  498. .defaultMessage(v.message())
  499. .messageKey(v.key())
  500. .build();
  501. }
  502. private ValidatorConfig processRequiredFieldValidatorAnnotation(RequiredFieldValidator v, String fieldName, String methodName) {
  503. String validatorType = "required";
  504. Map<String, String> params = new HashMap<String, String>();
  505. if (fieldName != null) {
  506. params.put("fieldName", fieldName);
  507. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  508. params.put("fieldName", v.fieldName());
  509. }
  510. validatorFactory.lookupRegisteredValidatorType(validatorType);
  511. return new ValidatorConfig.Builder(validatorType)
  512. .addParams(params)
  513. .addParam("methodName", methodName)
  514. .shortCircuit(v.shortCircuit())
  515. .defaultMessage(v.message())
  516. .messageKey(v.key())
  517. .build();
  518. }
  519. private ValidatorConfig processIntRangeFieldValidatorAnnotation(IntRangeFieldValidator v, String fieldName, String methodName) {
  520. String validatorType = "int";
  521. Map<String, String> params = new HashMap<String, String>();
  522. if (fieldName != null) {
  523. params.put("fieldName", fieldName);
  524. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  525. params.put("fieldName", v.fieldName());
  526. }
  527. if ( v.min() != null && v.min().length() > 0) {
  528. params.put("min", v.min());
  529. }
  530. if ( v.max() != null && v.max().length() > 0) {
  531. params.put("max", v.max());
  532. }
  533. validatorFactory.lookupRegisteredValidatorType(validatorType);
  534. return new ValidatorConfig.Builder(validatorType)
  535. .addParams(params)
  536. .addParam("methodName", methodName)
  537. .shortCircuit(v.shortCircuit())
  538. .defaultMessage(v.message())
  539. .messageKey(v.key())
  540. .build();
  541. }
  542. private ValidatorConfig processDoubleRangeFieldValidatorAnnotation(DoubleRangeFieldValidator v, String fieldName, String methodName) {
  543. String validatorType = "double";
  544. Map<String, String> params = new HashMap<String, String>();
  545. if (fieldName != null) {
  546. params.put("fieldName", fieldName);
  547. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  548. params.put("fieldName", v.fieldName());
  549. }
  550. if ( v.minInclusive() != null && v.minInclusive().length() > 0) {
  551. params.put("minInclusive", v.minInclusive());
  552. }
  553. if ( v.maxInclusive() != null && v.maxInclusive().length() > 0) {
  554. params.put("maxInclusive", v.maxInclusive());
  555. }
  556. if ( v.minExclusive() != null && v.minExclusive().length() > 0) {
  557. params.put("minExclusive", v.minExclusive());
  558. }
  559. if ( v.maxExclusive() != null && v.maxExclusive().length() > 0) {
  560. params.put("maxExclusive", v.maxExclusive());
  561. }
  562. validatorFactory.lookupRegisteredValidatorType(validatorType);
  563. return new ValidatorConfig.Builder(validatorType)
  564. .addParams(params)
  565. .addParam("methodName", methodName)
  566. .shortCircuit(v.shortCircuit())
  567. .defaultMessage(v.message())
  568. .messageKey(v.key())
  569. .build();
  570. }
  571. private ValidatorConfig processFieldExpressionValidatorAnnotation(FieldExpressionValidator v, String fieldName, String methodName) {
  572. String validatorType = "fieldexpression";
  573. Map<String, String> params = new HashMap<String, String>();
  574. if (fieldName != null) {
  575. params.put("fieldName", fieldName);
  576. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  577. params.put("fieldName", v.fieldName());
  578. }
  579. params.put("expression", v.expression());
  580. validatorFactory.lookupRegisteredValidatorType(validatorType);
  581. return new ValidatorConfig.Builder(validatorType)
  582. .addParams(params)
  583. .addParam("methodName", methodName)
  584. .shortCircuit(v.shortCircuit())
  585. .defaultMessage(v.message())
  586. .messageKey(v.key())
  587. .build();
  588. }
  589. private ValidatorConfig processEmailValidatorAnnotation(EmailValidator v, String fieldName, String methodName) {
  590. String validatorType = "email";
  591. Map<String, String> params = new HashMap<String, String>();
  592. if (fieldName != null) {
  593. params.put("fieldName", fieldName);
  594. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  595. params.put("fieldName", v.fieldName());
  596. }
  597. validatorFactory.lookupRegisteredValidatorType(validatorType);
  598. return new ValidatorConfig.Builder(validatorType)
  599. .addParams(params)
  600. .addParam("methodName", methodName)
  601. .shortCircuit(v.shortCircuit())
  602. .defaultMessage(v.message())
  603. .messageKey(v.key())
  604. .build();
  605. }
  606. private ValidatorConfig processDateRangeFieldValidatorAnnotation(DateRangeFieldValidator v, String fieldName, String methodName) {
  607. String validatorType = "date";
  608. Map<String, String> params = new HashMap<String, String>();
  609. if (fieldName != null) {
  610. params.put("fieldName", fieldName);
  611. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  612. params.put("fieldName", v.fieldName());
  613. }
  614. if ( v.min() != null && v.min().length() > 0) {
  615. final Date minDate = parseDateString(v.min());
  616. params.put("min", String.valueOf(minDate == null ? v.min() : minDate));
  617. }
  618. if ( v.max() != null && v.max().length() > 0) {
  619. final Date maxDate = parseDateString(v.max());
  620. params.put("max", String.valueOf(maxDate == null ? v.max() : maxDate));
  621. }
  622. validatorFactory.lookupRegisteredValidatorType(validatorType);
  623. return new ValidatorConfig.Builder(validatorType)
  624. .addParams(params)
  625. .addParam("methodName", methodName)
  626. .shortCircuit(v.shortCircuit())
  627. .defaultMessage(v.message())
  628. .messageKey(v.key())
  629. .build();
  630. }
  631. private ValidatorConfig processConversionErrorFieldValidatorAnnotation(ConversionErrorFieldValidator v, String fieldName, String methodName) {
  632. String validatorType = "conversion";
  633. Map<String, String> params = new HashMap<String, String>();
  634. if (fieldName != null) {
  635. params.put("fieldName", fieldName);
  636. } else if (v.fieldName() != null && v.fieldName().length() > 0 ) {
  637. params.put("fieldName", v.fieldName());
  638. }
  639. validatorFactory.lookupRegisteredValidatorType(validatorType);
  640. return new ValidatorConfig.Builder(validatorType)
  641. .addParams(params)
  642. .addParam("methodName", methodName)
  643. .shortCircuit(v.shortCircuit())
  644. .defaultMessage(v.message())
  645. .messageKey(v.key())
  646. .build();
  647. }
  648. public List<ValidatorConfig> buildAnnotationClassValidatorConfigs(Class aClass) {
  649. List<ValidatorConfig> result = new ArrayList<ValidatorConfig>();
  650. List<ValidatorConfig> temp = processAnnotations(aClass);
  651. if (temp != null) {
  652. result.addAll(temp);
  653. }
  654. Method[] methods = aClass.getDeclaredMethods();
  655. if ( methods != null ) {
  656. for (Method method : methods) {
  657. temp = processAnnotations(method);
  658. if (temp != null) {
  659. result.addAll(temp);
  660. }
  661. }
  662. }
  663. return result;
  664. }
  665. /**
  666. * Returns the property name for a method.
  667. * This method is independant from property fields.
  668. *
  669. * @param method The method to get the property name for.
  670. * @return the property name for given method; null if non could be resolved.
  671. */
  672. public String resolvePropertyName(Method method) {
  673. Matcher matcher = SETTER_PATTERN.matcher(method.getName());
  674. if (matcher.matches() && method.getParameterTypes().length == 1) {
  675. String raw = matcher.group(1);
  676. return raw.substring(0, 1).toLowerCase() + raw.substring(1);
  677. }
  678. matcher = GETTER_PATTERN.matcher(method.getName());
  679. if (matcher.matches() && method.getParameterTypes().length == 0) {
  680. String raw = matcher.group(2);
  681. return raw.substring(0, 1).toLowerCase() + raw.substring(1);
  682. }
  683. return null;
  684. }
  685. }