1/*
2 * ProGuard -- shrinking, optimization, obfuscation, and preverification
3 *             of Java bytecode.
4 *
5 * Copyright (c) 2002-2009 Eric Lafortune (eric@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 */
21package proguard.util;
22
23import 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 */
32public 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)
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            buffer.append(quotedString((String)list.get(index)));
54        }
55
56        return buffer.toString();
57    }
58
59
60    /**
61     * Creates a List of String objects from the given comma-separated String.
62     */
63    public static List commaSeparatedList(String string)
64    {
65        if (string == null)
66        {
67            return null;
68        }
69
70        List list = new ArrayList();
71        int index = 0;
72        while ((index = skipWhitespace(string, index)) < string.length())
73        {
74            int nextIndex;
75
76            // Do we have an opening quote?
77            if (string.charAt(index) == '\'')
78            {
79                // Parse a quoted string.
80                nextIndex = string.indexOf('\'', index + 1);
81                if (nextIndex < 0)
82                {
83                    nextIndex = string.length();
84                }
85
86                list.add(string.substring(index + 1, nextIndex));
87            }
88            else
89            {
90                // Parse a non-quoted string.
91                nextIndex = string.indexOf(',', index);
92                if (nextIndex < 0)
93                {
94                    nextIndex = string.length();
95                }
96
97                String substring = string.substring(index, nextIndex).trim();
98                if (substring.length() > 0)
99                {
100                    list.add(substring);
101                }
102            }
103
104            index = nextIndex + 1;
105        }
106
107        return list;
108    }
109
110
111    /**
112     * Skips any whitespace characters.
113     */
114    private static int skipWhitespace(String string, int index)
115    {
116        while (index < string.length() &&
117               Character.isWhitespace(string.charAt(index)))
118        {
119            index++;
120        }
121        return index;
122    }
123
124
125    /**
126     * Returns a quoted version of the given string, if necessary.
127     */
128    private static String quotedString(String string)
129    {
130        return string.length()     == 0 ||
131               string.indexOf(' ') >= 0 ||
132               string.indexOf('@') >= 0 ||
133               string.indexOf('{') >= 0 ||
134               string.indexOf('}') >= 0 ||
135               string.indexOf('(') >= 0 ||
136               string.indexOf(')') >= 0 ||
137               string.indexOf(':') >= 0 ||
138               string.indexOf(';') >= 0 ||
139               string.indexOf(',') >= 0  ? ("'" + string + "'") :
140                                           (      string      );
141    }
142
143
144    public static void main(String[] args)
145    {
146        if (args.length == 1)
147        {
148            System.out.println("Input string: ["+args[0]+"]");
149
150            List list = commaSeparatedList(args[0]);
151
152            System.out.println("Resulting list:");
153            for (int index = 0; index < list.size(); index++)
154            {
155                System.out.println("["+list.get(index)+"]");
156            }
157        }
158        else
159        {
160            List list = Arrays.asList(args);
161
162            System.out.println("Input list:");
163            for (int index = 0; index < list.size(); index++)
164            {
165                System.out.println("["+list.get(index)+"]");
166            }
167
168            String string = commaSeparatedString(list);
169
170            System.out.println("Resulting string: ["+string+"]");
171        }
172    }
173}
174