Details

    • Type: Bug Bug
    • Status: Open
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: 2.0.2-core
    • Fix Version/s: None
    • Component/s: Skinning
    • Labels:
      None

      Description

      In cases where skins specify overlapping version ranges, skin pregeneration may fail to generate certain style sheets.

      For example, imagine the skin specifies @agent rules for the following version ranges:

      1. min-version:1
      2. max:version:3
      3. min-version:8

      With our current implementation, we only attempt to generate style sheets for the start and end of each version range.

      For the above example, this would be:

      • 0 (start of #2)
      • 1 (start of #1
      • 3 (end of #2)
      • 8 (start of #3)
      • Integer.MAX_VALUE (end of #1 and #3)

      If the actual agent version is 7, we should use a style sheet that matches #1, but not #2 or #3. However, we since we only use the start/end points of each version range to determine which style sheets to pregenerate, we fail to pregenerate such a style sheet.

      1. trinidad-2250.patch
        11 kB
        Andy Schwartz
      2. trinidad-2250-take2.patch
        12 kB
        Andy Schwartz

        Activity

        Hide
        Andy Schwartz added a comment -

        This patch:

        https://issues.apache.org/jira/secure/attachment/12519643/trinidad-2250.patch

        Solves the problem by adding two new methods to Version:

        + /**
        + * Converts this Version to the previous version just before this
        + * version. For example, new Version("1.9").toPreviousVersion()
        + * results in the version "1.8".
        + *
        + * The resulting version is guaranteed to be "concrete" - ie.
        + * will contain no wildcards.
        + *
        + * Calling toPreviousVersion() on Version.MIN_VERSION returns
        + * Version.MIN_VERSION.
        + *
        + * @return the Version instance corresponding to the version just
        + * before this version.
        + */
        + public Version toPreviousVersion()

        + /**
        + * Converts this Version to the next version just after this
        + * version. For example, new Version("1.9").toPreviousVersion()
        + * results in the version "1.10".
        + *
        + * The resulting version is guaranteed to be "concrete" - ie.
        + * will contain no wildcards.
        + *
        + * Calling toNextVersion() on Version.MAX_VERSION returns
        + * Version.MAX_VERSION.
        + *
        + * @return the Version instance corresponding to the version just
        + * after this version.
        + */
        + public Version toNextVersion()

        We use these to expand the set of agent versions that we pregenerate - ie. in addition to the start/end of each @agent version range, we also attempt to pregenerate:

        • The version just previous to the start of the range.
        • The version just after the end of the range.

        Looking back at the example above, this means that we would pregenerate for:

        • 0 (start of #2)
        • 1 (start of #1
        • 3 (end of #2)
        • 4 (end.toNextVersion() of #2)
        • 7 (start.toPreviousVersion() of #3)
        • 8 (start of #3)
        • Integer.MAX_VALUE (end of #1 and #3)

        And thus cover the case where we match range #1 but not #2 or #3.

        Show
        Andy Schwartz added a comment - This patch: https://issues.apache.org/jira/secure/attachment/12519643/trinidad-2250.patch Solves the problem by adding two new methods to Version: + /** + * Converts this Version to the previous version just before this + * version. For example, new Version("1.9").toPreviousVersion() + * results in the version "1.8". + * + * The resulting version is guaranteed to be "concrete" - ie. + * will contain no wildcards. + * + * Calling toPreviousVersion() on Version.MIN_VERSION returns + * Version.MIN_VERSION. + * + * @return the Version instance corresponding to the version just + * before this version. + */ + public Version toPreviousVersion() + /** + * Converts this Version to the next version just after this + * version. For example, new Version("1.9").toPreviousVersion() + * results in the version "1.10". + * + * The resulting version is guaranteed to be "concrete" - ie. + * will contain no wildcards. + * + * Calling toNextVersion() on Version.MAX_VERSION returns + * Version.MAX_VERSION. + * + * @return the Version instance corresponding to the version just + * after this version. + */ + public Version toNextVersion() We use these to expand the set of agent versions that we pregenerate - ie. in addition to the start/end of each @agent version range, we also attempt to pregenerate: The version just previous to the start of the range. The version just after the end of the range. Looking back at the example above, this means that we would pregenerate for: 0 (start of #2) 1 (start of #1 3 (end of #2) 4 (end.toNextVersion() of #2) 7 (start.toPreviousVersion() of #3) 8 (start of #3) Integer.MAX_VALUE (end of #1 and #3) And thus cover the case where we match range #1 but not #2 or #3.
        Hide
        Andy Schwartz added a comment -

        New version of the patch:

        https://issues.apache.org/jira/secure/attachment/12519683/trinidad-2250-take2.patch

        With code review changes recommended by Blake.

        Show
        Andy Schwartz added a comment - New version of the patch: https://issues.apache.org/jira/secure/attachment/12519683/trinidad-2250-take2.patch With code review changes recommended by Blake.

          People

          • Assignee:
            Andy Schwartz
            Reporter:
            Andy Schwartz
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:

              Development