Coverage Report - org.webslinger.ext.wiki.WikiUtil
 
Classes in this File Line Coverage Branch Coverage Complexity
WikiUtil
96%
45/47
100%
6/6
58
 
 1  
 package org.webslinger.ext.wiki;
 2  
 
 3  0
 public final class WikiUtil {
 4  
     public static String cleanLink(String link) {
 5  17
         char[] chars = new char[link.length()];
 6  17
         char[] buffer = new char[link.length()];
 7  17
         int position = 0;
 8  17
         link.getChars(0, chars.length, chars, 0);
 9  17
         int mode = 0;
 10  
         int i;
 11  17
         boolean nonProtocolChar = false;
 12  
         //int segmentStart = 0;
 13  
 LOOP:
 14  209
         for (i = 0; i < chars.length; i++) {
 15  198
             char c = chars[i];
 16  
             // bad chars stripping
 17  198
             switch (c) {
 18  
                 case '^':
 19  
                 case ' ':
 20  
                 case '/':
 21  
                 case '\\':
 22  
                 case '.':
 23  
                 case '_':
 24  
                 case '-':
 25  
                 case '?':
 26  38
                     nonProtocolChar = true;
 27  38
                     break;
 28  
                 case 'a': case 'b': case 'c': case 'd': case 'e':
 29  
                 case 'f': case 'g': case 'h': case 'i': case 'j':
 30  
                 case 'k': case 'l': case 'm': case 'n': case 'o':
 31  
                 case 'p': case 'q': case 'r': case 's': case 't':
 32  
                 case 'u': case 'v': case 'w': case 'x': case 'y':
 33  
                 case 'z':
 34  115
                     break;
 35  
                 case ':':
 36  2
                     if (!nonProtocolChar) return link;
 37  
                     continue;
 38  
                 default:
 39  43
                     nonProtocolChar = true;
 40  43
                     if (Character.isLetterOrDigit(c)) break;
 41  
                     continue;
 42  
             }
 43  192
             switch (mode) {
 44  
                 case 0:
 45  39
                     switch (c) {
 46  
                         case '/':
 47  
                             //sb.append('/');
 48  5
                             buffer[position++] = '/';
 49  5
                             mode = 1;
 50  5
                             break;
 51  
                         case ' ':
 52  
                         case '-':
 53  0
                             break;
 54  
                         case '?':
 55  1
                             StringBuilder sb = new StringBuilder(position + chars.length - i);
 56  1
                             sb.append(buffer, 0, position).append(chars, i, chars.length - i);
 57  1
                             return sb.toString();
 58  
                         default:
 59  
                             //sb.append(Character.toUpperCase(c));
 60  33
                             buffer[position++] = Character.toUpperCase(c);
 61  33
                             mode = 2;
 62  
                             //segmentStart = i + 1;
 63  
                     }
 64  38
                     break;
 65  
                 case 1:
 66  12
                     switch (c) {
 67  
                         case '/':
 68  
                         case ' ':
 69  
                         case '-':
 70  1
                             break;
 71  
                         case '?':
 72  2
                             StringBuilder sb = new StringBuilder(position + chars.length - i);
 73  2
                             sb.append(buffer, 0, position).append(chars, i, chars.length - i);
 74  2
                             return sb.toString();
 75  
                         default:
 76  
                             //sb.append(Character.toUpperCase(c));
 77  9
                             buffer[position++] = Character.toUpperCase(c);
 78  
                             //segmentStart = i + 1;
 79  9
                             mode = 2;
 80  
                     }
 81  10
                     break;
 82  
                 case 2:
 83  141
                     switch (c) {
 84  
                         case '/':
 85  
                             //sb.append(chars, segmentStart, i - segmentStart + 1);
 86  6
                             buffer[position++] = '/';
 87  
                             //sb.append('/');
 88  6
                             mode = 1;
 89  6
                             break;
 90  
                         case ' ':
 91  
                         case '-':
 92  
                             //sb.append(chars, segmentStart, i - segmentStart);
 93  22
                             mode = 0;
 94  22
                             break;
 95  
                         case '?':
 96  
                             //sb.append(chars, segmentStart, chars.length - segmentStart);
 97  1
                             StringBuilder sb = new StringBuilder(position + chars.length - i);
 98  1
                             sb.append(buffer, 0, position).append(chars, i, chars.length - i);
 99  1
                             return sb.toString();
 100  
                         default:
 101  112
                             buffer[position++] = c;
 102  
                             //sb.append(c);
 103  
                     }
 104  
                     break;
 105  
             }
 106  
         }
 107  11
         return new String(buffer, 0, position);
 108  
     }
 109  
 }