Home | History | Annotate | Download | only in util
      1 /*
      2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
      3  *             of Java bytecode.
      4  *
      5  * Copyright (c) 2002-2014 Eric Lafortune (eric (at) graphics.cornell.edu)
      6  *
      7  * This program is free software; you can redistribute it and/or modify it
      8  * under the terms of the GNU General Public License as published by the Free
      9  * Software Foundation; either version 2 of the License, or (at your option)
     10  * any later version.
     11  *
     12  * This program is distributed in the hope that it will be useful, but WITHOUT
     13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
     15  * more details.
     16  *
     17  * You should have received a copy of the GNU General Public License along
     18  * with this program; if not, write to the Free Software Foundation, Inc.,
     19  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
     20  */
     21 package proguard.util;
     22 
     23 import java.util.*;
     24 
     25 
     26 /**
     27  * This class provides some utility methods for working with
     28  * <code>java.util.List</code> objects.
     29  *
     30  * @author Eric Lafortune
     31  */
     32 public class ListUtil
     33 {
     34     /**
     35      * Creates a comma-separated String from the given List of String objects.
     36      */
     37     public static String commaSeparatedString(List list, boolean quoteStrings)
     38     {
     39         if (list == null)
     40         {
     41             return null;
     42         }
     43 
     44         StringBuffer buffer = new StringBuffer();
     45 
     46         for (int index = 0; index < list.size(); index++)
     47         {
     48             if (index > 0)
     49             {
     50                 buffer.append(',');
     51             }
     52 
     53             String string = (String)list.get(index);
     54 
     55             if (quoteStrings)
     56             {
     57                 string = quotedString(string);
     58             }
     59 
     60             buffer.append(string);
     61         }
     62 
     63         return buffer.toString();
     64     }
     65 
     66 
     67     /**
     68      * Creates a List of String objects from the given comma-separated String.
     69      */
     70     public static List commaSeparatedList(String string)
     71     {
     72         if (string == null)
     73         {
     74             return null;
     75         }
     76 
     77         List list = new ArrayList();
     78         int index = 0;
     79         while ((index = skipWhitespace(string, index)) < string.length())
     80         {
     81             int nextIndex;
     82 
     83             // Do we have an opening quote?
     84             if (string.charAt(index) == '\'')
     85             {
     86                 // Parse a quoted string.
     87                 nextIndex = string.indexOf('\'', index + 1);
     88                 if (nextIndex < 0)
     89                 {
     90                     nextIndex = string.length();
     91                 }
     92 
     93                 list.add(string.substring(index + 1, nextIndex));
     94             }
     95             else
     96             {
     97                 // Parse a non-quoted string.
     98                 nextIndex = string.indexOf(',', index);
     99                 if (nextIndex < 0)
    100                 {
    101                     nextIndex = string.length();
    102                 }
    103 
    104                 String substring = string.substring(index, nextIndex).trim();
    105                 if (substring.length() > 0)
    106                 {
    107                     list.add(substring);
    108                 }
    109             }
    110 
    111             index = nextIndex + 1;
    112         }
    113 
    114         return list;
    115     }
    116 
    117 
    118     /**
    119      * Skips any whitespace characters.
    120      */
    121     private static int skipWhitespace(String string, int index)
    122     {
    123         while (index < string.length() &&
    124                Character.isWhitespace(string.charAt(index)))
    125         {
    126             index++;
    127         }
    128         return index;
    129     }
    130 
    131 
    132     /**
    133      * Returns a quoted version of the given string, if necessary.
    134      */
    135     private static String quotedString(String string)
    136     {
    137         return string.length()     == 0 ||
    138                string.indexOf(' ') >= 0 ||
    139                string.indexOf('@') >= 0 ||
    140                string.indexOf('{') >= 0 ||
    141                string.indexOf('}') >= 0 ||
    142                string.indexOf('(') >= 0 ||
    143                string.indexOf(')') >= 0 ||
    144                string.indexOf(':') >= 0 ||
    145                string.indexOf(';') >= 0 ||
    146                string.indexOf(',') >= 0  ? ("'" + string + "'") :
    147                                            (      string      );
    148     }
    149 
    150 
    151     public static void main(String[] args)
    152     {
    153         if (args.length == 1)
    154         {
    155             System.out.println("Input string: ["+args[0]+"]");
    156 
    157             List list = commaSeparatedList(args[0]);
    158 
    159             System.out.println("Resulting list:");
    160             for (int index = 0; index < list.size(); index++)
    161             {
    162                 System.out.println("["+list.get(index)+"]");
    163             }
    164         }
    165         else
    166         {
    167             List list = Arrays.asList(args);
    168 
    169             System.out.println("Input list:");
    170             for (int index = 0; index < list.size(); index++)
    171             {
    172                 System.out.println("["+list.get(index)+"]");
    173             }
    174 
    175             String string = commaSeparatedString(list, true);
    176 
    177             System.out.println("Resulting string: ["+string+"]");
    178         }
    179     }
    180 }
    181