¶Ô±ÈÐÂÎļþ |
| | |
| | | /* |
| | | * Copyright (c) 2018-2028, DreamLu All rights reserved. |
| | | * |
| | | * Redistribution and use in source and binary forms, with or without |
| | | * modification, are permitted provided that the following conditions are met: |
| | | * |
| | | * Redistributions of source code must retain the above copyright notice, |
| | | * this list of conditions and the following disclaimer. |
| | | * Redistributions in binary form must reproduce the above copyright |
| | | * notice, this list of conditions and the following disclaimer in the |
| | | * documentation and/or other materials provided with the distribution. |
| | | * Neither the name of the dreamlu.net developer nor the names of its |
| | | * contributors may be used to endorse or promote products derived from |
| | | * this software without specific prior written permission. |
| | | * Author: DreamLu 墿¥æ¢¦ (596392912@qq.com) |
| | | */ |
| | | |
| | | package org.springblade.core.tool.utils; |
| | | |
| | | import org.springframework.lang.Nullable; |
| | | |
| | | /** |
| | | * çæ¬å·æ¯è¾å·¥å
· |
| | | * <p> |
| | | * æè·¯æ¥æºäºï¼ https://github.com/hotoo/versioning/blob/master/versioning.js |
| | | * <p> |
| | | * example |
| | | * * ##宿´æ¨¡å¼ |
| | | * Version.of("v0.1.1").eq("v0.1.2"); // false |
| | | * <p> |
| | | * ##ä¸å®æ´æ¨¡å¼ |
| | | * Version.of("v0.1").incomplete().eq("v0.1.2"); // true |
| | | * |
| | | * @author L.cm |
| | | * email: 596392912@qq.com |
| | | * site:http://www.dreamlu.net |
| | | * date 2015å¹´7æ9æ¥ä¸å10:48:39 |
| | | */ |
| | | public class Version { |
| | | private static final String DELIMITER = "\\."; |
| | | |
| | | /** |
| | | * çæ¬å· |
| | | */ |
| | | @Nullable |
| | | private String version; |
| | | /** |
| | | * æ¯å¦å®æ´æ¨¡å¼ï¼é»è®¤ä½¿ç¨å®æ´æ¨¡å¼ |
| | | */ |
| | | private boolean complete = true; |
| | | |
| | | /** |
| | | * ç§æå®ä¾åæé æ¹æ³ |
| | | */ |
| | | private Version() { |
| | | } |
| | | |
| | | private Version(@Nullable String version) { |
| | | this.version = version; |
| | | } |
| | | |
| | | /** |
| | | * ä¸å®æ´æ¨¡å¼ |
| | | * |
| | | * @return {Version} |
| | | */ |
| | | public Version incomplete() { |
| | | this.complete = false; |
| | | return this; |
| | | } |
| | | |
| | | /** |
| | | * æé å¨ |
| | | * |
| | | * @param version çæ¬ |
| | | * @return {Version} |
| | | */ |
| | | public static Version of(@Nullable String version) { |
| | | return new Version(version); |
| | | } |
| | | |
| | | /** |
| | | * æ¯è¾çæ¬å·æ¯å¦ç¸å |
| | | * <p> |
| | | * example: |
| | | * * Version.of("v0.3").eq("v0.4") |
| | | * |
| | | * @param version åç¬¦ä¸²çæ¬å· |
| | | * @return {boolean} |
| | | */ |
| | | public boolean eq(@Nullable String version) { |
| | | return compare(version) == 0; |
| | | } |
| | | |
| | | /** |
| | | * ä¸ç¸å |
| | | * <p> |
| | | * example: |
| | | * * Version.of("v0.3").ne("v0.4") |
| | | * |
| | | * @param version åç¬¦ä¸²çæ¬å· |
| | | * @return {boolean} |
| | | */ |
| | | public boolean ne(@Nullable String version) { |
| | | return compare(version) != 0; |
| | | } |
| | | |
| | | /** |
| | | * å¤§äº |
| | | * |
| | | * @param version çæ¬å· |
| | | * @return æ¯å¦å¤§äº |
| | | */ |
| | | public boolean gt(@Nullable String version) { |
| | | return compare(version) > 0; |
| | | } |
| | | |
| | | /** |
| | | * 大äºåçäº |
| | | * |
| | | * @param version çæ¬å· |
| | | * @return æ¯å¦å¤§äºåçäº |
| | | */ |
| | | public boolean gte(@Nullable String version) { |
| | | return compare(version) >= 0; |
| | | } |
| | | |
| | | /** |
| | | * å°äº |
| | | * |
| | | * @param version çæ¬å· |
| | | * @return æ¯å¦å°äº |
| | | */ |
| | | public boolean lt(@Nullable String version) { |
| | | return compare(version) < 0; |
| | | } |
| | | |
| | | /** |
| | | * å°äºåçäº |
| | | * |
| | | * @param version çæ¬å· |
| | | * @return æ¯å¦å°äºåçäº |
| | | */ |
| | | public boolean lte(@Nullable String version) { |
| | | return compare(version) <= 0; |
| | | } |
| | | |
| | | /** |
| | | * åå¦å¤ä¸ä¸ªçæ¬å·æ¯è¾ |
| | | * |
| | | * @param version çæ¬å· |
| | | * @return {int} |
| | | */ |
| | | private int compare(@Nullable String version) { |
| | | return Version.compare(this.version, version, complete); |
| | | } |
| | | |
| | | /** |
| | | * æ¯è¾2ä¸ªçæ¬å· |
| | | * |
| | | * @param v1 v1 |
| | | * @param v2 v2 |
| | | * @param complete æ¯å¦å®æ´çæ¯è¾ä¸¤ä¸ªçæ¬ |
| | | * @return (v1 < v2) ? -1 : ((v1 == v2) ? 0 : 1) |
| | | */ |
| | | private static int compare(@Nullable String v1, @Nullable String v2, boolean complete) { |
| | | // v1 nullè§ä¸ºæå°çæ¬ï¼æå¨å |
| | | if (v1 == v2) { |
| | | return 0; |
| | | } else if (v1 == null) { |
| | | return -1; |
| | | } else if (v2 == null) { |
| | | return 1; |
| | | } |
| | | // å»é¤ç©ºæ ¼ |
| | | v1 = v1.trim(); |
| | | v2 = v2.trim(); |
| | | if (v1.equals(v2)) { |
| | | return 0; |
| | | } |
| | | String[] v1s = v1.split(DELIMITER); |
| | | String[] v2s = v2.split(DELIMITER); |
| | | int v1sLen = v1s.length; |
| | | int v2sLen = v2s.length; |
| | | int len = complete |
| | | ? Math.max(v1sLen, v2sLen) |
| | | : Math.min(v1sLen, v2sLen); |
| | | |
| | | for (int i = 0; i < len; i++) { |
| | | String c1 = len > v1sLen || null == v1s[i] ? "" : v1s[i]; |
| | | String c2 = len > v2sLen || null == v2s[i] ? "" : v2s[i]; |
| | | |
| | | int result = c1.compareTo(c2); |
| | | if (result != 0) { |
| | | return result; |
| | | } |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | } |