[ 
https://issues.apache.org/jira/browse/LANG-1480?focusedWorklogId=316658&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-316658
 ]

ASF GitHub Bot logged work on LANG-1480:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 23/Sep/19 13:31
            Start Date: 23/Sep/19 13:31
    Worklog Time Spent: 10m 
      Work Description: verhas commented on pull request #446: LANG-1480 
getAbbreviatedName refactored to create appropriate length …
URL: https://github.com/apache/commons-lang/pull/446#discussion_r327104320
 
 

 ##########
 File path: src/main/java/org/apache/commons/lang3/ClassUtils.java
 ##########
 @@ -433,48 +440,83 @@ public static String getAbbreviatedName(final Class<?> 
cls, final int len) {
      * <tr><td>"java.lang.String"</td><td> 5</td><td>"j.l.String"</td></tr>
      * <tr><td>"java.lang.String"</td><td>15</td><td>"j.lang.String"</td></tr>
      * 
<tr><td>"java.lang.String"</td><td>30</td><td>"java.lang.String"</td></tr>
+     * 
<tr><td>"org.apache.commons.lang3.ClassUtils"</td><td>18</td><td>"o.a.c.l.ClassUtils"</td></tr>
      * </table>
-     * @param className  the className to get the abbreviated name for, may be 
{@code null}
-     * @param len  the desired length of the abbreviated name
-     * @return the abbreviated name or an empty string
-     * @throws IllegalArgumentException if len &lt;= 0
+     *
+     * @param className the className to get the abbreviated name for, may be 
{@code null}
+     * @param len       the desired length of the abbreviated name
+     * @return the abbreviated name or an empty string if the specified
+     * class name is {@code null} or empty string. The abbreviated name may be
+     * longer than the desired length if it cannot be abbreviated to the 
desired length.
+     * @throws IllegalArgumentException if {@code len <= 0}
      * @since 3.4
      */
     public static String getAbbreviatedName(final String className, final int 
len) {
-      if (len <= 0) {
-        throw new IllegalArgumentException("len must be > 0");
-      }
-      if (className == null) {
-        return StringUtils.EMPTY;
-      }
-
-      int availableSpace = len;
-      final int packageLevels = StringUtils.countMatches(className, '.');
-      final String[] output = new String[packageLevels + 1];
-      int endIndex = className.length() - 1;
-      for (int level = packageLevels; level >= 0; level--) {
-        final int startIndex = className.lastIndexOf('.', endIndex);
-        final String part = className.substring(startIndex + 1, endIndex + 1);
-        availableSpace -= part.length();
-        if (level > 0) {
-          // all elements except top level require an additional char space
-          availableSpace--;
+        if (len <= 0) {
+            throw new IllegalArgumentException("len must be > 0");
         }
-        if (level == packageLevels) {
-          // ClassName is always complete
-          output[level] = part;
-        } else {
-          if (availableSpace > 0) {
-            output[level] = part;
-          } else {
-            // if no space is left still the first char is used
-            output[level] = part.substring(0, 1);
-          }
+        if (className == null) {
+            return StringUtils.EMPTY;
         }
 
 Review comment:
   There is no point to add a test. This is not a feature change. This is a 
performance optimization. I do not think the method should guarantee as an API 
contract that it will return the same String object in this case.
   
   In other cases I totally agree: if there is a change, which is functionality 
change then there should be a test also changed.
 
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Issue Time Tracking
-------------------

            Worklog Id:     (was: 316658)
    Remaining Estimate: 18.5h  (was: 18h 40m)
            Time Spent: 5.5h  (was: 5h 20m)

> ClassUtils. getAbbreviatedName(String ,int) returns too long result
> -------------------------------------------------------------------
>
>                 Key: LANG-1480
>                 URL: https://issues.apache.org/jira/browse/LANG-1480
>             Project: Commons Lang
>          Issue Type: Bug
>          Components: lang.*
>    Affects Versions: 3.9
>         Environment: Environment independent.
>            Reporter: Peter Verhas
>            Assignee: Bruno P. Kinoshita
>            Priority: Major
>   Original Estimate: 24h
>          Time Spent: 5.5h
>  Remaining Estimate: 18.5h
>
> In some cases, the algorithm decides incorrectly when to which package names 
> to abbreviate. For example, abbreviating
> {{org.apache.commons.lang3.ClassUtils}} to the length 18 will result 
> {{o.a.c.lang3.ClassUtils}} (22 characters) instead of {{o.a.c.l.ClassUtils}} 
> (18 characters as requested). The reason for this is that the algorithm 
> starts from the right and goes to the left abbreviating the packages and 
> starts to abbreviate the packages when it runs out of the available space.
> Instead, the algorithm should start from the left and abbreviate all packages 
> that would result in a too-long string without abbreviating the package name.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to