content: /*
   * Copyright 1999-2018 Alibaba Group Holding Ltd.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package com.alibaba.csp.sentinel.dashboard.util;
  
  import java.util.Optional;
  
  import com.alibaba.csp.sentinel.util.StringUtil;
  
  import com.alibaba.csp.sentinel.dashboard.datasource.entity.SentinelVersion;
  
  /**
   * Util class for parsing version.
   *
   * @author Eric Zhao
   * @since 0.2.1
   */
  public final class VersionUtils {
  
      /**
       * Parse version of Sentinel from raw string.
       *
       * @param verStr version string
       * @return parsed {@link SentinelVersion} if the version is valid; empty if
       * there is something wrong with the format
       */
      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();
          }
      }
  
      private VersionUtils() {}
  }
  