/protostuffdb-core/src/main/java/com/dyuproject/protostuff/RpcValidation.java

https://gitlab.com/dyu/protostuffdb · Java · 739 lines · 546 code · 131 blank · 62 comment · 115 complexity · 97952985c6c900efd1b7b57e745d1870 MD5 · raw file

  1. //========================================================================
  2. //Copyright 2007-2011 David Yu dyuproject@gmail.com
  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. //http://www.apache.org/licenses/LICENSE-2.0
  8. //Unless required by applicable law or agreed to in writing, software
  9. //distributed under the License is distributed on an "AS IS" BASIS,
  10. //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. //See the License for the specific language governing permissions and
  12. //limitations under the License.
  13. //========================================================================
  14. package com.dyuproject.protostuff;
  15. import static com.dyuproject.protostuffdb.Validation.isValidCreditCardNumber;
  16. import static com.dyuproject.protostuffdb.Validation.isValidDate;
  17. import static com.dyuproject.protostuffdb.Validation.isValidDecimalMax;
  18. import static com.dyuproject.protostuffdb.Validation.isValidDecimalMin;
  19. import static com.dyuproject.protostuffdb.Validation.isValidDigits;
  20. import static com.dyuproject.protostuffdb.Validation.isValidEmail;
  21. import static com.dyuproject.protostuffdb.Validation.isValidFuture;
  22. import static com.dyuproject.protostuffdb.Validation.isValidFutureOrToday;
  23. import static com.dyuproject.protostuffdb.Validation.isValidFutureTS;
  24. import static com.dyuproject.protostuffdb.Validation.isValidGT;
  25. import static com.dyuproject.protostuffdb.Validation.isValidLength;
  26. import static com.dyuproject.protostuffdb.Validation.isValidLuhn;
  27. import static com.dyuproject.protostuffdb.Validation.isValidMax;
  28. import static com.dyuproject.protostuffdb.Validation.isValidMin;
  29. import static com.dyuproject.protostuffdb.Validation.isValidNotBlank;
  30. import static com.dyuproject.protostuffdb.Validation.isValidNotEmpty;
  31. import static com.dyuproject.protostuffdb.Validation.isValidNotNull;
  32. import static com.dyuproject.protostuffdb.Validation.isValidNotNullNotEmpty;
  33. import static com.dyuproject.protostuffdb.Validation.isValidNull;
  34. import static com.dyuproject.protostuffdb.Validation.isValidPast;
  35. import static com.dyuproject.protostuffdb.Validation.isValidPastOrToday;
  36. import static com.dyuproject.protostuffdb.Validation.isValidPastTS;
  37. import static com.dyuproject.protostuffdb.Validation.isValidPattern;
  38. import static com.dyuproject.protostuffdb.Validation.isValidRange;
  39. import static com.dyuproject.protostuffdb.Validation.isValidSafeHtml;
  40. import static com.dyuproject.protostuffdb.Validation.isValidScriptAssert;
  41. import static com.dyuproject.protostuffdb.Validation.isValidSize;
  42. import static com.dyuproject.protostuffdb.Validation.isValidTime;
  43. import static com.dyuproject.protostuffdb.Validation.isValidURL;
  44. import static com.dyuproject.protostuffdb.Validation.isValidUniqueIds;
  45. import static com.dyuproject.protostuffdb.Validation.isValidUniqueKeys;
  46. import java.math.BigDecimal;
  47. import java.util.ArrayList;
  48. import java.util.Collection;
  49. import java.util.Date;
  50. import java.util.HashMap;
  51. import java.util.List;
  52. import java.util.regex.Pattern;
  53. import com.dyuproject.protostuff.ds.CAS;
  54. import com.dyuproject.protostuffdb.HasId;
  55. import com.dyuproject.protostuffdb.HasIds;
  56. import com.dyuproject.protostuffdb.HasKey;
  57. import com.dyuproject.protostuffdb.HasKeys;
  58. import com.dyuproject.protostuffdb.HasParentKey;
  59. import com.dyuproject.protostuffdb.KeyUtil;
  60. import com.dyuproject.protostuffdb.Validation;
  61. /**
  62. * FFValidation
  63. *
  64. * @author David Yu
  65. * @created Jul 19, 2011
  66. */
  67. public final class RpcValidation
  68. {
  69. public static final boolean FAIL_FAST = Boolean.parseBoolean(
  70. System.getProperty("dsrpc.validation.fail_fast", "true"));
  71. private static final HashMap<String,Pattern> __uniqueRegExps =
  72. new HashMap<String,Pattern>();
  73. static final ThreadLocal<ArrayList<String>> localV =
  74. new ThreadLocal<ArrayList<String>>()
  75. {
  76. protected ArrayList<String> initialValue()
  77. {
  78. return new ArrayList<String>();
  79. }
  80. };
  81. public static String msg(String msg)
  82. {
  83. // return raw msg to have same gwt behavior.
  84. return msg;
  85. //return ByteString.stringDefaultValue(msg);
  86. /*for(int i = 0, len = msg.length(); i < len; i++)
  87. {
  88. if(msg.charAt(i) > 0x7f)
  89. return ByteString.stringDefaultValue(msg);
  90. }
  91. return msg;*/
  92. }
  93. public static synchronized Pattern pattern(String regex)
  94. {
  95. regex = msg(regex);
  96. // TODO synchronize
  97. Pattern p = __uniqueRegExps.get(regex);
  98. if(p == null)
  99. {
  100. __uniqueRegExps.put(regex, (p = Pattern.compile(regex)));
  101. }
  102. return p;
  103. }
  104. private static boolean addMessage(String msg)
  105. {
  106. if(FAIL_FAST)
  107. throw RpcRuntimeExceptions.validation(msg);
  108. localV.get().add(msg);
  109. return false;
  110. }
  111. public static ArrayList<String> getMessages()
  112. {
  113. return localV.get();
  114. }
  115. /**
  116. * Returns true if there are error messsages on the current validation context.
  117. */
  118. public static boolean hasErrors()
  119. {
  120. return !getMessages().isEmpty();
  121. }
  122. /* ================================================== */
  123. // utility for custom/complex validation
  124. public static boolean validIf(boolean expression)
  125. {
  126. return validIf(expression, RpcProtocol.INVALID_REQUEST);
  127. }
  128. public static boolean validIf(boolean expression, String message)
  129. {
  130. return expression || addMessage(message);
  131. }
  132. public static boolean invalidIf(boolean expression)
  133. {
  134. return invalidIf(expression, RpcProtocol.INVALID_REQUEST);
  135. }
  136. public static boolean invalidIf(boolean expression, String message)
  137. {
  138. return !expression || addMessage(message);
  139. }
  140. /* ================================================== */
  141. public static boolean verifyAsciiOnly(String message, String value)
  142. {
  143. return Validation.isAsciiOnly(value) || addMessage(message);
  144. }
  145. public static boolean verifyAsciiOnly(String message, Collection<String> value)
  146. {
  147. for (String s : value)
  148. {
  149. if (!Validation.isAsciiOnly(s))
  150. return addMessage(message);
  151. }
  152. return true;
  153. }
  154. public static boolean verifyAsciiPrintable(String message, String value)
  155. {
  156. return Validation.isAsciiPrintable(value) || addMessage(message);
  157. }
  158. public static boolean verifyAsciiPrintable(String message, Collection<String> value)
  159. {
  160. for (String s : value)
  161. {
  162. if (!Validation.isAsciiPrintable(s))
  163. return addMessage(message);
  164. }
  165. return true;
  166. }
  167. public static boolean verifyAsciiSafeHtml(String message, String value)
  168. {
  169. return Validation.isAsciiSafeHtml(value) || addMessage(message);
  170. }
  171. public static boolean verifyAsciiSafeHtml(String message, Collection<String> value)
  172. {
  173. for (String s : value)
  174. {
  175. if (!Validation.isAsciiSafeHtml(s))
  176. return addMessage(message);
  177. }
  178. return true;
  179. }
  180. public static boolean verifyAssertFalse(String message, boolean value)
  181. {
  182. return !value || addMessage(message);
  183. }
  184. public static boolean verifyAssertTrue(String message, boolean value)
  185. {
  186. return value || addMessage(message);
  187. }
  188. public static boolean verifyId(String message, int value)
  189. {
  190. return Validation.isValidId(value) || addMessage(message);
  191. }
  192. public static boolean verifyId(String message, List<Integer> list)
  193. {
  194. if (list == null || list.isEmpty())
  195. return true;
  196. for (Integer v : list)
  197. {
  198. if (!Validation.isValidId(v))
  199. return addMessage(message);
  200. }
  201. return true;
  202. }
  203. public static boolean verifyKey(String message, byte[] value)
  204. {
  205. return KeyUtil.isKey(value) || addMessage(message);
  206. }
  207. public static boolean verifyKey(String message, byte[] value, int kind)
  208. {
  209. return KeyUtil.isKey(value, kind) || addMessage(message);
  210. }
  211. public static boolean verifyKey(String message, List<byte[]> list)
  212. {
  213. if (list == null || list.isEmpty())
  214. return true;
  215. for(byte[] key : list)
  216. {
  217. if(!KeyUtil.isKey(key))
  218. return addMessage(message);
  219. }
  220. return true;
  221. }
  222. public static boolean verifyKey(String message, List<byte[]> list, int kind)
  223. {
  224. if (list == null || list.isEmpty())
  225. return true;
  226. for(byte[] key : list)
  227. {
  228. if(!KeyUtil.isKey(key, kind))
  229. return addMessage(message);
  230. }
  231. return true;
  232. }
  233. public static boolean verifyUnique(final String message,
  234. final List<byte[]> list)
  235. {
  236. return Validation.isValidUnique(list) || addMessage(message);
  237. }
  238. public static boolean verifyUnique(final String message,
  239. final List<byte[]> list, final int kind)
  240. {
  241. return Validation.isValidUnique(list, kind) || addMessage(message);
  242. }
  243. public static boolean verifyUnique(final String message,
  244. final List<String> list, String dummy)
  245. {
  246. return Validation.isValidUnique(list, dummy) || addMessage(message);
  247. }
  248. public static boolean verifyUnique(final String message,
  249. final List<Integer> list, Integer dummy)
  250. {
  251. return Validation.isValidUnique(list, dummy) || addMessage(message);
  252. }
  253. public static boolean verifyUnique(final String message,
  254. final List<Integer> list, final int min, Integer dummy)
  255. {
  256. return Validation.isValidUnique(list, min, dummy) || addMessage(message);
  257. }
  258. public static boolean verifyUnique(final String message,
  259. final List<Long> list, Long dummy)
  260. {
  261. return Validation.isValidUnique(list, dummy) || addMessage(message);
  262. }
  263. public static boolean verifyUnique(final String message,
  264. final List<Long> list, final long min, Long dummy)
  265. {
  266. return Validation.isValidUnique(list, min, dummy) || addMessage(message);
  267. }
  268. public static <T extends HasId> boolean verifyUnique(final String message,
  269. final List<T> list, final int min, HasId dummy)
  270. {
  271. return Validation.isValidUnique(list, min, dummy) || addMessage(message);
  272. }
  273. /**
  274. * If kind is zero, it is assumed that the key was validated with a kind before this
  275. * call.
  276. */
  277. public static <T extends HasKey> boolean verifyUnique(final String message,
  278. final List<T> list, final int kind, HasKey dummy)
  279. {
  280. return Validation.isValidUnique(list, kind, dummy) || addMessage(message);
  281. }
  282. /**
  283. * If kind is zero, it is assumed that the key was validated with a kind before this
  284. * call.
  285. */
  286. public static <T extends HasParentKey> boolean verifyUnique(final String message,
  287. final List<T> list, final int kind, HasParentKey dummy)
  288. {
  289. return Validation.isValidUnique(list, kind, dummy) || addMessage(message);
  290. }
  291. /**
  292. * If kind is zero, it is assumed that the key was validated with a kind before this
  293. * call.
  294. */
  295. public static <T extends HasId, K extends HasKey> boolean verifyUnique(final String message,
  296. final List<T> idlist, final int min,
  297. final List<K> keylist, final int kind)
  298. {
  299. return Validation.isValidUnique(idlist, min, keylist, kind) || addMessage(message);
  300. }
  301. public static <T extends HasKeys> boolean verifyUniqueKeys(final String message,
  302. final List<T> list, final int ... indices)
  303. {
  304. return isValidUniqueKeys(list, indices) || addMessage(message);
  305. }
  306. public static <T extends HasKeys> boolean verifyUniqueKeys(final String message,
  307. final List<T> list, final int index)
  308. {
  309. return isValidUniqueKeys(list, index) || addMessage(message);
  310. }
  311. public static <T extends HasIds> boolean verifyUniqueIds(final String message,
  312. final List<T> list, final int ... indices)
  313. {
  314. return isValidUniqueIds(list, indices) || addMessage(message);
  315. }
  316. public static <T extends HasIds> boolean verifyUniqueIds(final String message,
  317. final List<T> list, final int index)
  318. {
  319. return isValidUniqueIds(list, index) || addMessage(message);
  320. }
  321. public static boolean verifyTime(String message, int value)
  322. {
  323. return isValidTime(value) || addMessage(message);
  324. }
  325. public static boolean verifyDate(String message, long value)
  326. {
  327. return isValidDate(value) || addMessage(message);
  328. }
  329. public static boolean verifyDecimalMax(String message, BigDecimal value, BigDecimal maxValue)
  330. {
  331. return isValidDecimalMax(value, maxValue) || addMessage(message);
  332. }
  333. public static boolean verifyDecimalMax(String message, String value, BigDecimal maxValue)
  334. {
  335. return isValidDecimalMax(value, maxValue) || addMessage(message);
  336. }
  337. public static boolean verifyDecimalMax(String message, float value, float maxValue)
  338. {
  339. return isValidDecimalMax(value, maxValue) || addMessage(message);
  340. }
  341. public static boolean verifyDecimalMax(String message, double value, double maxValue)
  342. {
  343. return isValidDecimalMax(value, maxValue) || addMessage(message);
  344. }
  345. public static boolean verifyDecimalMin(String message, BigDecimal value, BigDecimal minValue)
  346. {
  347. return isValidDecimalMin(value, minValue) || addMessage(message);
  348. }
  349. public static boolean verifyDecimalMin(String message, String value, BigDecimal minValue)
  350. {
  351. return isValidDecimalMin(value, minValue) || addMessage(message);
  352. }
  353. public static boolean verifyDecimalMin(String message, float value, float minValue)
  354. {
  355. return isValidDecimalMin(value, minValue) || addMessage(message);
  356. }
  357. public static boolean verifyDecimalMin(String message, double value, double minValue)
  358. {
  359. return isValidDecimalMin(value, minValue) || addMessage(message);
  360. }
  361. public static boolean verifyDigits(String message, BigDecimal value,
  362. int maxIntegerLength, int maxFractionLength)
  363. {
  364. return isValidDigits(value, maxIntegerLength, maxFractionLength) || addMessage(message);
  365. }
  366. public static boolean verifyDigits(String message, String value,
  367. int maxIntegerLength, int maxFractionLength)
  368. {
  369. return isValidDigits(value, maxIntegerLength, maxFractionLength) || addMessage(message);
  370. }
  371. public static boolean verifyDigits(String message, int value,
  372. int maxIntegerLength, int maxFractionLength)
  373. {
  374. return isValidDigits(value, maxIntegerLength, maxFractionLength) || addMessage(message);
  375. }
  376. public static boolean verifyDigits(String message, long value,
  377. int maxIntegerLength, int maxFractionLength)
  378. {
  379. return isValidDigits(value, maxIntegerLength, maxFractionLength) || addMessage(message);
  380. }
  381. public static boolean verifyDigits(String message, float value,
  382. int maxIntegerLength, int maxFractionLength)
  383. {
  384. return isValidDigits(value, maxIntegerLength, maxFractionLength) || addMessage(message);
  385. }
  386. public static boolean verifyDigits(String message, double value,
  387. int maxIntegerLength, int maxFractionLength)
  388. {
  389. return isValidDigits(value, maxIntegerLength, maxFractionLength) || addMessage(message);
  390. }
  391. public static boolean verifyDigits(String message, Number value,
  392. int maxIntegerLength, int maxFractionLength)
  393. {
  394. return isValidDigits(value, maxIntegerLength, maxFractionLength) || addMessage(message);
  395. }
  396. public static boolean verifyEmail(String message, CharSequence value)
  397. {
  398. return isValidEmail(value) || addMessage(message);
  399. }
  400. public static boolean verifyFutureTS(String message, long value) // timestamp
  401. {
  402. return isValidFutureTS(value) || addMessage(message);
  403. }
  404. public static boolean verifyFutureTS(String message, long value, int unit, int min, int max) // timestamp
  405. {
  406. return isValidFutureTS(value, unit, min, max) || addMessage(message);
  407. }
  408. public static boolean verifyFutureOrToday(String message, long value, int min, int max) // utc date
  409. {
  410. return isValidFutureOrToday(value, min, max) || addMessage(message);
  411. }
  412. public static boolean verifyFuture(String message, long value, int min, int max) // utc date
  413. {
  414. return isValidFuture(value, min, max) || addMessage(message);
  415. }
  416. public static boolean verifyFuture(String message, Date value)
  417. {
  418. return isValidFuture(value) || addMessage(message);
  419. }
  420. /*public static boolean verifyFuture(String message, Calendar value)
  421. {
  422. return isValidFuture(value) || addMessage(message);
  423. }*/
  424. public static boolean verifyLength(String message, CharSequence value, int min, int max)
  425. {
  426. return isValidLength(value, min, max) || addMessage(message);
  427. }
  428. public static boolean verifyLuhn(String message, String value, int multiplicator)
  429. {
  430. return isValidLuhn(value, multiplicator) || addMessage(message);
  431. }
  432. /* ================================================== */
  433. public static boolean verifyMax(String message, int value, int max)
  434. {
  435. return isValidMax(value, max) || addMessage(message);
  436. }
  437. public static boolean verifyMax(String message, long value, long max)
  438. {
  439. return isValidMax(value, max) || addMessage(message);
  440. }
  441. public static boolean verifyMax(String message, float value, float max)
  442. {
  443. return isValidMax(value, max) || addMessage(message);
  444. }
  445. public static boolean verifyMax(String message, double value, double max)
  446. {
  447. return isValidMax(value, max) || addMessage(message);
  448. }
  449. public static boolean verifyMax(String message, String value, long max)
  450. {
  451. return isValidMax(value, max) || addMessage(message);
  452. }
  453. /* ================================================== */
  454. public static boolean verifyMin(String message, int value, int min)
  455. {
  456. return isValidMin(value, min) || addMessage(message);
  457. }
  458. public static boolean verifyMin(String message, long value, long min)
  459. {
  460. return isValidMin(value, min) || addMessage(message);
  461. }
  462. public static boolean verifyMin(String message, float value, float min)
  463. {
  464. return isValidMin(value, min) || addMessage(message);
  465. }
  466. public static boolean verifyMin(String message, double value, double min)
  467. {
  468. return isValidMin(value, min) || addMessage(message);
  469. }
  470. public static boolean verifyMin(String message, String value, long min)
  471. {
  472. return isValidMin(value, min) || addMessage(message);
  473. }
  474. /* ================================================== */
  475. public static boolean verifyGT(String message, int value, int param)
  476. {
  477. return isValidGT(value, param) || addMessage(message);
  478. }
  479. public static boolean verifyGT(String message, long value, long param)
  480. {
  481. return isValidGT(value, param) || addMessage(message);
  482. }
  483. public static boolean verifyGT(String message, float value, float param)
  484. {
  485. return isValidGT(value, param) || addMessage(message);
  486. }
  487. public static boolean verifyGT(String message, double value, double param)
  488. {
  489. return isValidGT(value, param) || addMessage(message);
  490. }
  491. public static boolean verifyGT(String message, String value, long param)
  492. {
  493. return isValidGT(value, param) || addMessage(message);
  494. }
  495. /* ================================================== */
  496. public static boolean verifyNotBlank(String message, String value)
  497. {
  498. return isValidNotBlank(value) || addMessage(message);
  499. }
  500. // add-on
  501. public static boolean verifyNotBlank(String message, CharSequence value)
  502. {
  503. return isValidNotBlank(value) || addMessage(message);
  504. }
  505. public static boolean verifyNotEmpty(String message, String value)
  506. {
  507. return isValidNotEmpty(value) || addMessage(message);
  508. }
  509. // add-on
  510. public static boolean verifyNotEmpty(String message, CharSequence value)
  511. {
  512. return isValidNotEmpty(value) || addMessage(message);
  513. }
  514. public static boolean verifyNotEmpty(String message, CAS value)
  515. {
  516. return isValidNotEmpty(value) || addMessage(message);
  517. }
  518. public static boolean verifyNotNull(String message, Object value)
  519. {
  520. return isValidNotNull(value) || addMessage(message);
  521. }
  522. public static boolean verifyNull(String message, Object value)
  523. {
  524. return isValidNull(value) || addMessage(message);
  525. }
  526. public static boolean verifyNotNullNotEmpty(String message, List<?> value)
  527. {
  528. return isValidNotNullNotEmpty(value) || addMessage(message);
  529. }
  530. public static boolean verifyPastTS(String message, long value) // timestamp
  531. {
  532. return isValidPastTS(value) || addMessage(message);
  533. }
  534. public static boolean verifyPastTS(String message, long value, int unit, int min, int max) // timestamp
  535. {
  536. return isValidPastTS(value, unit, min, max) || addMessage(message);
  537. }
  538. public static boolean verifyPastOrToday(String message, long value, int min, int max) // utc
  539. {
  540. return isValidPastOrToday(value, min, max) || addMessage(message);
  541. }
  542. public static boolean verifyPast(String message, long value, int min, int max) // utc
  543. {
  544. return isValidPast(value, min, max) || addMessage(message);
  545. }
  546. public static boolean verifyPast(String message, Date value)
  547. {
  548. return isValidPast(value) || addMessage(message);
  549. }
  550. /*public static boolean verifyPast(String message, Calendar value)
  551. {
  552. return isValidPast(value) || addMessage(message);
  553. }*/
  554. public static boolean verifyPattern(String message, CharSequence value, Pattern pattern)
  555. {
  556. return isValidPattern(value, pattern) || addMessage(message);
  557. }
  558. public static boolean verifySafeHtml(String message, CharSequence value) // needs a whitelist arg
  559. {
  560. return isValidSafeHtml(value) || addMessage(message);
  561. }
  562. public static boolean verifyScriptAssert(String message, Object value)
  563. {
  564. return isValidScriptAssert(value) || addMessage(message);
  565. }
  566. public static boolean verifySize(String message, Collection<?> value, int min, int max)
  567. {
  568. return isValidSize(value, min, max) || addMessage(message);
  569. }
  570. public static boolean verifySize(String message, CharSequence value, int min, int max)
  571. {
  572. return isValidSize(value, min, max) || addMessage(message);
  573. }
  574. // port should be passed as -1 if not configured
  575. public static boolean verifyURL(String message, String value, String protocol, String host, int port)
  576. {
  577. return isValidURL(value, protocol, host, port) || addMessage(message);
  578. }
  579. public static boolean verifyURL(String message, String value, String protocol, String host)
  580. {
  581. return isValidURL(value, protocol, host, -1) || addMessage(message);
  582. }
  583. public static boolean verifyRange(String message, int value, int min, int max)
  584. {
  585. return isValidRange(value, min, max) || addMessage(message);
  586. }
  587. public static boolean verifyRange(String message, long value, long min, long max)
  588. {
  589. return isValidRange(value, min, max) || addMessage(message);
  590. }
  591. public static boolean verifyRange(String message, float value, float min, float max)
  592. {
  593. return isValidRange(value, min, max) || addMessage(message);
  594. }
  595. public static boolean verifyRange(String message, double value, double min, double max)
  596. {
  597. return isValidRange(value, min, max) || addMessage(message);
  598. }
  599. public static boolean verifyRange(String message, String value, long min, long max)
  600. {
  601. return isValidRange(value, min, max) || addMessage(message);
  602. }
  603. public static boolean verifyCreditCardNumber(String message, String value)
  604. {
  605. return isValidCreditCardNumber(value) || addMessage(message);
  606. }
  607. }