private double _matchVersion()

in trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/agent/parse/NameVersion.java [380:490]


  private double _matchVersion(VersionEntry entry,
                               VersionId version)
  {
    if (version == null)
      return NO_MATCH; //request has no version info, but entry has version requirement. Hence no match

    if (entry._type == VersionEntry.STAR_TYPE)
    {
      Iterator<String> vIterator1 = version.iterator();
      Iterator<String> vIterator2 = entry._versionId.iterator();

      //Check upto where both have values
      int matchedParts = 0;
      while ((vIterator1.hasNext()) && (vIterator2.hasNext()))
      {
        String part1 = vIterator1.next();
        String part2 = vIterator2.next();
        if (!part1.equals(part2))
          return NO_MATCH;
        matchedParts++;
      }

      //So far they match. Now if version condition has more
      //parts (sub versions), then it must be .0's
      while (vIterator2.hasNext())
      {
        if (!"0".equals(vIterator2.next()))
          return NO_MATCH;
      }

      //now check how many parts the VersionId has
      int totNoOfParts = matchedParts;
      while (vIterator1.hasNext())
      {
        totNoOfParts++;
        vIterator1.next();
      }


      return (VERSION_STAR_MATCH * matchedParts / totNoOfParts);
    }
    else if (entry._type == VersionEntry.PLUS_TYPE)
    {
      Iterator<String> vIterator1 = version.iterator();
      Iterator<String> vIterator2 = entry._versionId.iterator();

      //Check upto where both have values
      while ((vIterator1.hasNext()) && (vIterator2.hasNext()))
      {
        try
        {
          int v1 = Integer.parseInt(vIterator1.next());
          int v2 = Integer.parseInt(vIterator2.next());
          if (v1 > v2)
            return (VERSION_GE_MATCH * (entry._versionId.getVersion() / version.getVersion()));
          else if (v1 < v2)
            return NO_MATCH;
        }
        catch (NumberFormatException npe)
        {
          return NO_MATCH;
        }
      }

      //if we reach here they two number are equal so far
      //Check if remaining are .0's
      while (vIterator2.hasNext())
      {
        try
        {
          if (Integer.parseInt(vIterator2.next()) != 0)
            return NO_MATCH;
        }
        catch (NumberFormatException npe)
        {
          return NO_MATCH;
        }
      }

      return (VERSION_GE_MATCH * (entry._versionId.getVersion() / version.getVersion()));
    }
    else
    {
      //exact match
      Iterator<String> vIterator1 = version.iterator();
      Iterator<String> vIterator2 = entry._versionId.iterator();

      //Check upto where both have values
      while ((vIterator1.hasNext()) && (vIterator2.hasNext()))
      {
        String part1 = vIterator1.next();
        String part2 = vIterator2.next();
        if (!part1.equals(part2))
          return NO_MATCH;
      }

      while (vIterator1.hasNext())
      {
        if (!"0".equals(vIterator1.next()))
          return NO_MATCH;
      }

      while (vIterator2.hasNext())
      {
        if (!"0".equals(vIterator2.next()))
          return NO_MATCH;
      }

      return VERSION_EXACT_MATCH;
    }
  }