public static Optional<SentinelVersion> parseVersion(String verStr) {
        if (StringUtil.isBlank(verStr)) {
            return Optional.empty();
        }
        try {
            String versionFull = verStr;
            SentinelVersion version = new SentinelVersion();
            
            // postfix
            int index = versionFull.indexOf("-");
            if (index == 0) {
                // Start with "-"
                return Optional.empty();
            }
            if (index == versionFull.length() - 1) {
                // End with "-"
            } else if (index > 0) {
                version.setPostfix(versionFull.substring(index + 1));
            }
            
            if (index >= 0) {
                versionFull = versionFull.substring(0, index);
            }
            
            // x.x.x
            int segment = 0;
            int[] ver = new int[3];
            while (segment < ver.length) {
                index = versionFull.indexOf('.');
                if (index < 0) {
                    if (versionFull.length() > 0) {
                        ver[segment] = Integer.valueOf(versionFull);
                    }
                    break;
                }
                ver[segment] = Integer.valueOf(versionFull.substring(0, index));
                versionFull = versionFull.substring(index + 1);
                segment ++;
            }
            
            if (ver[0] < 1) {
                // Wrong format, return empty.
                return Optional.empty();
            } else {
                return Optional.of(version
                        .setMajorVersion(ver[0])
                        .setMinorVersion(ver[1])
                        .setFixVersion(ver[2]));
            }
        } catch (Exception ex) {
            // Parse fail, return empty.
            return Optional.empty();
        }
    }
@Test
    public void test() {
        Optional<SentinelVersion> version = VersionUtils.parseVersion("1.2.3");
        assertTrue(version.isPresent());
        assertEquals(1, version.get().getMajorVersion());
        assertEquals(2, version.get().getMinorVersion());
        assertEquals(3, version.get().getFixVersion());
        assertNull(version.get().getPostfix());
        
        version = VersionUtils.parseVersion("1.2");
        assertTrue(version.isPresent());
        assertEquals(1, version.get().getMajorVersion());
        assertEquals(2, version.get().getMinorVersion());
        assertEquals(0, version.get().getFixVersion());
        assertNull(version.get().getPostfix());
        
        version = VersionUtils.parseVersion("1.");
        assertTrue(version.isPresent());
        assertEquals(1, version.get().getMajorVersion());
        assertEquals(0, version.get().getMinorVersion());
        assertEquals(0, version.get().getFixVersion());
        assertNull(version.get().getPostfix());
        
        version = VersionUtils.parseVersion("1.2.");
        assertTrue(version.isPresent());
        assertEquals(1, version.get().getMajorVersion());
        assertEquals(2, version.get().getMinorVersion());
        assertEquals(0, version.get().getFixVersion());
        assertNull(version.get().getPostfix());
        
        version = VersionUtils.parseVersion("1.2.3.");
        assertTrue(version.isPresent());
        assertEquals(1, version.get().getMajorVersion());
        assertEquals(2, version.get().getMinorVersion());
        assertEquals(3, version.get().getFixVersion());
        assertNull(version.get().getPostfix());
        
        version = VersionUtils.parseVersion("1.2.3.4");
        assertTrue(version.isPresent());
        assertEquals(1, version.get().getMajorVersion());
        assertEquals(2, version.get().getMinorVersion());
        assertEquals(3, version.get().getFixVersion());
        assertNull(version.get().getPostfix());
        
        version = VersionUtils.parseVersion("1");
        assertTrue(version.isPresent());
        assertEquals(1, version.get().getMajorVersion());
        assertEquals(0, version.get().getMinorVersion());
        assertEquals(0, version.get().getFixVersion());
        assertNull(version.get().getPostfix());
        
        version = VersionUtils.parseVersion("1.2.3-");
        assertTrue(version.isPresent());
        assertEquals(1, version.get().getMajorVersion());
        assertEquals(2, version.get().getMinorVersion());
        assertEquals(3, version.get().getFixVersion());
        assertNull(version.get().getPostfix());
        
        version = VersionUtils.parseVersion("-");
        assertFalse(version.isPresent());
        
        version = VersionUtils.parseVersion("-t");
        assertFalse(version.isPresent());
        
        version = VersionUtils.parseVersion("");
        assertFalse(version.isPresent());
        
        version = VersionUtils.parseVersion(null);
        assertFalse(version.isPresent());
        
        version = VersionUtils.parseVersion("1.2.3-SNAPSHOTS");
        assertTrue(version.isPresent());
        assertEquals(1, version.get().getMajorVersion());
        assertEquals(2, version.get().getMinorVersion());
        assertEquals(3, version.get().getFixVersion());
        assertEquals("SNAPSHOTS", version.get().getPostfix());
    }