blob: 12e283db453fb0b03799413d9836ac6f659d42ed [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body>
<main role="main">
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span><a id="line.1">/*</a>
<span class="sourceLineNo">002</span><a id="line.2"> * Licensed to the Apache Software Foundation (ASF) under one</a>
<span class="sourceLineNo">003</span><a id="line.3"> * or more contributor license agreements. See the NOTICE file</a>
<span class="sourceLineNo">004</span><a id="line.4"> * distributed with this work for additional information</a>
<span class="sourceLineNo">005</span><a id="line.5"> * regarding copyright ownership. The ASF licenses this file</a>
<span class="sourceLineNo">006</span><a id="line.6"> * to you under the Apache License, Version 2.0 (the</a>
<span class="sourceLineNo">007</span><a id="line.7"> * "License"); you may not use this file except in compliance</a>
<span class="sourceLineNo">008</span><a id="line.8"> * with the License. You may obtain a copy of the License at</a>
<span class="sourceLineNo">009</span><a id="line.9"> *</a>
<span class="sourceLineNo">010</span><a id="line.10"> * http://www.apache.org/licenses/LICENSE-2.0</a>
<span class="sourceLineNo">011</span><a id="line.11"> *</a>
<span class="sourceLineNo">012</span><a id="line.12"> * Unless required by applicable law or agreed to in writing,</a>
<span class="sourceLineNo">013</span><a id="line.13"> * software distributed under the License is distributed on an</a>
<span class="sourceLineNo">014</span><a id="line.14"> * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</a>
<span class="sourceLineNo">015</span><a id="line.15"> * KIND, either express or implied. See the License for the</a>
<span class="sourceLineNo">016</span><a id="line.16"> * specific language governing permissions and limitations</a>
<span class="sourceLineNo">017</span><a id="line.17"> * under the License.</a>
<span class="sourceLineNo">018</span><a id="line.18"> */</a>
<span class="sourceLineNo">019</span><a id="line.19">package org.apache.shiro.util;</a>
<span class="sourceLineNo">020</span><a id="line.20"></a>
<span class="sourceLineNo">021</span><a id="line.21">import java.text.ParseException;</a>
<span class="sourceLineNo">022</span><a id="line.22">import java.util.*;</a>
<span class="sourceLineNo">023</span><a id="line.23"></a>
<span class="sourceLineNo">024</span><a id="line.24">/**</a>
<span class="sourceLineNo">025</span><a id="line.25"> * &lt;p&gt;Simple utility class for String operations useful across the framework.</a>
<span class="sourceLineNo">026</span><a id="line.26"> * &lt;p/&gt;</a>
<span class="sourceLineNo">027</span><a id="line.27"> * &lt;p&gt;Some methods in this class were copied from the Spring Framework so we didn't have to re-invent the wheel,</a>
<span class="sourceLineNo">028</span><a id="line.28"> * and in these cases, we have retained all license, copyright and author information.</a>
<span class="sourceLineNo">029</span><a id="line.29"> *</a>
<span class="sourceLineNo">030</span><a id="line.30"> * @since 0.9</a>
<span class="sourceLineNo">031</span><a id="line.31"> */</a>
<span class="sourceLineNo">032</span><a id="line.32">public class StringUtils {</a>
<span class="sourceLineNo">033</span><a id="line.33"></a>
<span class="sourceLineNo">034</span><a id="line.34"> //TODO - complete JavaDoc</a>
<span class="sourceLineNo">035</span><a id="line.35"></a>
<span class="sourceLineNo">036</span><a id="line.36"> /**</a>
<span class="sourceLineNo">037</span><a id="line.37"> * Constant representing the empty string, equal to &amp;quot;&amp;quot;</a>
<span class="sourceLineNo">038</span><a id="line.38"> */</a>
<span class="sourceLineNo">039</span><a id="line.39"> public static final String EMPTY_STRING = "";</a>
<span class="sourceLineNo">040</span><a id="line.40"></a>
<span class="sourceLineNo">041</span><a id="line.41"> /**</a>
<span class="sourceLineNo">042</span><a id="line.42"> * Constant representing the default delimiter character (comma), equal to &lt;code&gt;','&lt;/code&gt;</a>
<span class="sourceLineNo">043</span><a id="line.43"> */</a>
<span class="sourceLineNo">044</span><a id="line.44"> public static final char DEFAULT_DELIMITER_CHAR = ',';</a>
<span class="sourceLineNo">045</span><a id="line.45"></a>
<span class="sourceLineNo">046</span><a id="line.46"> /**</a>
<span class="sourceLineNo">047</span><a id="line.47"> * Constant representing the default quote character (double quote), equal to '&amp;quot;'&lt;/code&gt;</a>
<span class="sourceLineNo">048</span><a id="line.48"> */</a>
<span class="sourceLineNo">049</span><a id="line.49"> public static final char DEFAULT_QUOTE_CHAR = '"';</a>
<span class="sourceLineNo">050</span><a id="line.50"></a>
<span class="sourceLineNo">051</span><a id="line.51"> /**</a>
<span class="sourceLineNo">052</span><a id="line.52"> * Check whether the given String has actual text.</a>
<span class="sourceLineNo">053</span><a id="line.53"> * More specifically, returns &lt;code&gt;true&lt;/code&gt; if the string not &lt;code&gt;null&lt;/code&gt;,</a>
<span class="sourceLineNo">054</span><a id="line.54"> * its length is greater than 0, and it contains at least one non-whitespace character.</a>
<span class="sourceLineNo">055</span><a id="line.55"> * &lt;p/&gt;</a>
<span class="sourceLineNo">056</span><a id="line.56"> * &lt;code&gt;StringUtils.hasText(null) == false&lt;br/&gt;</a>
<span class="sourceLineNo">057</span><a id="line.57"> * StringUtils.hasText("") == false&lt;br/&gt;</a>
<span class="sourceLineNo">058</span><a id="line.58"> * StringUtils.hasText(" ") == false&lt;br/&gt;</a>
<span class="sourceLineNo">059</span><a id="line.59"> * StringUtils.hasText("12345") == true&lt;br/&gt;</a>
<span class="sourceLineNo">060</span><a id="line.60"> * StringUtils.hasText(" 12345 ") == true&lt;/code&gt;</a>
<span class="sourceLineNo">061</span><a id="line.61"> * &lt;p/&gt;</a>
<span class="sourceLineNo">062</span><a id="line.62"> * &lt;p&gt;Copied from the Spring Framework while retaining all license, copyright and author information.</a>
<span class="sourceLineNo">063</span><a id="line.63"> *</a>
<span class="sourceLineNo">064</span><a id="line.64"> * @param str the String to check (may be &lt;code&gt;null&lt;/code&gt;)</a>
<span class="sourceLineNo">065</span><a id="line.65"> * @return &lt;code&gt;true&lt;/code&gt; if the String is not &lt;code&gt;null&lt;/code&gt;, its length is</a>
<span class="sourceLineNo">066</span><a id="line.66"> * greater than 0, and it does not contain whitespace only</a>
<span class="sourceLineNo">067</span><a id="line.67"> * @see java.lang.Character#isWhitespace</a>
<span class="sourceLineNo">068</span><a id="line.68"> */</a>
<span class="sourceLineNo">069</span><a id="line.69"> public static boolean hasText(String str) {</a>
<span class="sourceLineNo">070</span><a id="line.70"> if (!hasLength(str)) {</a>
<span class="sourceLineNo">071</span><a id="line.71"> return false;</a>
<span class="sourceLineNo">072</span><a id="line.72"> }</a>
<span class="sourceLineNo">073</span><a id="line.73"> int strLen = str.length();</a>
<span class="sourceLineNo">074</span><a id="line.74"> for (int i = 0; i &lt; strLen; i++) {</a>
<span class="sourceLineNo">075</span><a id="line.75"> if (!Character.isWhitespace(str.charAt(i))) {</a>
<span class="sourceLineNo">076</span><a id="line.76"> return true;</a>
<span class="sourceLineNo">077</span><a id="line.77"> }</a>
<span class="sourceLineNo">078</span><a id="line.78"> }</a>
<span class="sourceLineNo">079</span><a id="line.79"> return false;</a>
<span class="sourceLineNo">080</span><a id="line.80"> }</a>
<span class="sourceLineNo">081</span><a id="line.81"></a>
<span class="sourceLineNo">082</span><a id="line.82"> /**</a>
<span class="sourceLineNo">083</span><a id="line.83"> * Check that the given String is neither &lt;code&gt;null&lt;/code&gt; nor of length 0.</a>
<span class="sourceLineNo">084</span><a id="line.84"> * Note: Will return &lt;code&gt;true&lt;/code&gt; for a String that purely consists of whitespace.</a>
<span class="sourceLineNo">085</span><a id="line.85"> * &lt;p/&gt;</a>
<span class="sourceLineNo">086</span><a id="line.86"> * &lt;code&gt;StringUtils.hasLength(null) == false&lt;br/&gt;</a>
<span class="sourceLineNo">087</span><a id="line.87"> * StringUtils.hasLength("") == false&lt;br/&gt;</a>
<span class="sourceLineNo">088</span><a id="line.88"> * StringUtils.hasLength(" ") == true&lt;br/&gt;</a>
<span class="sourceLineNo">089</span><a id="line.89"> * StringUtils.hasLength("Hello") == true&lt;/code&gt;</a>
<span class="sourceLineNo">090</span><a id="line.90"> * &lt;p/&gt;</a>
<span class="sourceLineNo">091</span><a id="line.91"> * Copied from the Spring Framework while retaining all license, copyright and author information.</a>
<span class="sourceLineNo">092</span><a id="line.92"> *</a>
<span class="sourceLineNo">093</span><a id="line.93"> * @param str the String to check (may be &lt;code&gt;null&lt;/code&gt;)</a>
<span class="sourceLineNo">094</span><a id="line.94"> * @return &lt;code&gt;true&lt;/code&gt; if the String is not null and has length</a>
<span class="sourceLineNo">095</span><a id="line.95"> * @see #hasText(String)</a>
<span class="sourceLineNo">096</span><a id="line.96"> */</a>
<span class="sourceLineNo">097</span><a id="line.97"> public static boolean hasLength(String str) {</a>
<span class="sourceLineNo">098</span><a id="line.98"> return (str != null &amp;&amp; str.length() &gt; 0);</a>
<span class="sourceLineNo">099</span><a id="line.99"> }</a>
<span class="sourceLineNo">100</span><a id="line.100"></a>
<span class="sourceLineNo">101</span><a id="line.101"></a>
<span class="sourceLineNo">102</span><a id="line.102"> /**</a>
<span class="sourceLineNo">103</span><a id="line.103"> * Test if the given String starts with the specified prefix,</a>
<span class="sourceLineNo">104</span><a id="line.104"> * ignoring upper/lower case.</a>
<span class="sourceLineNo">105</span><a id="line.105"> * &lt;p/&gt;</a>
<span class="sourceLineNo">106</span><a id="line.106"> * &lt;p&gt;Copied from the Spring Framework while retaining all license, copyright and author information.</a>
<span class="sourceLineNo">107</span><a id="line.107"> *</a>
<span class="sourceLineNo">108</span><a id="line.108"> * @param str the String to check</a>
<span class="sourceLineNo">109</span><a id="line.109"> * @param prefix the prefix to look for</a>
<span class="sourceLineNo">110</span><a id="line.110"> * @return &lt;code&gt;true&lt;/code&gt; starts with the specified prefix (ignoring case), &lt;code&gt;false&lt;/code&gt; if it does not.</a>
<span class="sourceLineNo">111</span><a id="line.111"> * @see java.lang.String#startsWith</a>
<span class="sourceLineNo">112</span><a id="line.112"> */</a>
<span class="sourceLineNo">113</span><a id="line.113"> public static boolean startsWithIgnoreCase(String str, String prefix) {</a>
<span class="sourceLineNo">114</span><a id="line.114"> if (str == null || prefix == null) {</a>
<span class="sourceLineNo">115</span><a id="line.115"> return false;</a>
<span class="sourceLineNo">116</span><a id="line.116"> }</a>
<span class="sourceLineNo">117</span><a id="line.117"> if (str.startsWith(prefix)) {</a>
<span class="sourceLineNo">118</span><a id="line.118"> return true;</a>
<span class="sourceLineNo">119</span><a id="line.119"> }</a>
<span class="sourceLineNo">120</span><a id="line.120"> if (str.length() &lt; prefix.length()) {</a>
<span class="sourceLineNo">121</span><a id="line.121"> return false;</a>
<span class="sourceLineNo">122</span><a id="line.122"> }</a>
<span class="sourceLineNo">123</span><a id="line.123"> String lcStr = str.substring(0, prefix.length()).toLowerCase();</a>
<span class="sourceLineNo">124</span><a id="line.124"> String lcPrefix = prefix.toLowerCase();</a>
<span class="sourceLineNo">125</span><a id="line.125"> return lcStr.equals(lcPrefix);</a>
<span class="sourceLineNo">126</span><a id="line.126"> }</a>
<span class="sourceLineNo">127</span><a id="line.127"></a>
<span class="sourceLineNo">128</span><a id="line.128"> /**</a>
<span class="sourceLineNo">129</span><a id="line.129"> * Returns a 'cleaned' representation of the specified argument. 'Cleaned' is defined as the following:</a>
<span class="sourceLineNo">130</span><a id="line.130"> * &lt;p/&gt;</a>
<span class="sourceLineNo">131</span><a id="line.131"> * &lt;ol&gt;</a>
<span class="sourceLineNo">132</span><a id="line.132"> * &lt;li&gt;If the specified &lt;code&gt;String&lt;/code&gt; is &lt;code&gt;null&lt;/code&gt;, return &lt;code&gt;null&lt;/code&gt;&lt;/li&gt;</a>
<span class="sourceLineNo">133</span><a id="line.133"> * &lt;li&gt;If not &lt;code&gt;null&lt;/code&gt;, {@link String#trim() trim()} it.&lt;/li&gt;</a>
<span class="sourceLineNo">134</span><a id="line.134"> * &lt;li&gt;If the trimmed string is equal to the empty String (i.e. &amp;quot;&amp;quot;), return &lt;code&gt;null&lt;/code&gt;&lt;/li&gt;</a>
<span class="sourceLineNo">135</span><a id="line.135"> * &lt;li&gt;If the trimmed string is not the empty string, return the trimmed version&lt;/li&gt;.</a>
<span class="sourceLineNo">136</span><a id="line.136"> * &lt;/ol&gt;</a>
<span class="sourceLineNo">137</span><a id="line.137"> * &lt;p/&gt;</a>
<span class="sourceLineNo">138</span><a id="line.138"> * Therefore this method always ensures that any given string has trimmed text, and if it doesn't, &lt;code&gt;null&lt;/code&gt;</a>
<span class="sourceLineNo">139</span><a id="line.139"> * is returned.</a>
<span class="sourceLineNo">140</span><a id="line.140"> *</a>
<span class="sourceLineNo">141</span><a id="line.141"> * @param in the input String to clean.</a>
<span class="sourceLineNo">142</span><a id="line.142"> * @return a populated-but-trimmed String or &lt;code&gt;null&lt;/code&gt; otherwise</a>
<span class="sourceLineNo">143</span><a id="line.143"> */</a>
<span class="sourceLineNo">144</span><a id="line.144"> public static String clean(String in) {</a>
<span class="sourceLineNo">145</span><a id="line.145"> String out = in;</a>
<span class="sourceLineNo">146</span><a id="line.146"></a>
<span class="sourceLineNo">147</span><a id="line.147"> if (in != null) {</a>
<span class="sourceLineNo">148</span><a id="line.148"> out = in.trim();</a>
<span class="sourceLineNo">149</span><a id="line.149"> if (out.equals(EMPTY_STRING)) {</a>
<span class="sourceLineNo">150</span><a id="line.150"> out = null;</a>
<span class="sourceLineNo">151</span><a id="line.151"> }</a>
<span class="sourceLineNo">152</span><a id="line.152"> }</a>
<span class="sourceLineNo">153</span><a id="line.153"></a>
<span class="sourceLineNo">154</span><a id="line.154"> return out;</a>
<span class="sourceLineNo">155</span><a id="line.155"> }</a>
<span class="sourceLineNo">156</span><a id="line.156"></a>
<span class="sourceLineNo">157</span><a id="line.157"> /**</a>
<span class="sourceLineNo">158</span><a id="line.158"> * Returns the specified array as a comma-delimited (',') string.</a>
<span class="sourceLineNo">159</span><a id="line.159"> *</a>
<span class="sourceLineNo">160</span><a id="line.160"> * @param array the array whose contents will be converted to a string.</a>
<span class="sourceLineNo">161</span><a id="line.161"> * @return the array's contents as a comma-delimited (',') string.</a>
<span class="sourceLineNo">162</span><a id="line.162"> * @since 1.0</a>
<span class="sourceLineNo">163</span><a id="line.163"> */</a>
<span class="sourceLineNo">164</span><a id="line.164"> public static String toString(Object[] array) {</a>
<span class="sourceLineNo">165</span><a id="line.165"> return toDelimitedString(array, ",");</a>
<span class="sourceLineNo">166</span><a id="line.166"> }</a>
<span class="sourceLineNo">167</span><a id="line.167"></a>
<span class="sourceLineNo">168</span><a id="line.168"> /**</a>
<span class="sourceLineNo">169</span><a id="line.169"> * Returns the array's contents as a string, with each element delimited by the specified</a>
<span class="sourceLineNo">170</span><a id="line.170"> * {@code delimiter} argument. Useful for {@code toString()} implementations and log messages.</a>
<span class="sourceLineNo">171</span><a id="line.171"> *</a>
<span class="sourceLineNo">172</span><a id="line.172"> * @param array the array whose contents will be converted to a string</a>
<span class="sourceLineNo">173</span><a id="line.173"> * @param delimiter the delimiter to use between each element</a>
<span class="sourceLineNo">174</span><a id="line.174"> * @return a single string, delimited by the specified {@code delimiter}.</a>
<span class="sourceLineNo">175</span><a id="line.175"> * @since 1.0</a>
<span class="sourceLineNo">176</span><a id="line.176"> */</a>
<span class="sourceLineNo">177</span><a id="line.177"> public static String toDelimitedString(Object[] array, String delimiter) {</a>
<span class="sourceLineNo">178</span><a id="line.178"> if (array == null || array.length == 0) {</a>
<span class="sourceLineNo">179</span><a id="line.179"> return EMPTY_STRING;</a>
<span class="sourceLineNo">180</span><a id="line.180"> }</a>
<span class="sourceLineNo">181</span><a id="line.181"> StringBuilder sb = new StringBuilder();</a>
<span class="sourceLineNo">182</span><a id="line.182"> for (int i = 0; i &lt; array.length; i++) {</a>
<span class="sourceLineNo">183</span><a id="line.183"> if (i &gt; 0) {</a>
<span class="sourceLineNo">184</span><a id="line.184"> sb.append(delimiter);</a>
<span class="sourceLineNo">185</span><a id="line.185"> }</a>
<span class="sourceLineNo">186</span><a id="line.186"> sb.append(array[i]);</a>
<span class="sourceLineNo">187</span><a id="line.187"> }</a>
<span class="sourceLineNo">188</span><a id="line.188"> return sb.toString();</a>
<span class="sourceLineNo">189</span><a id="line.189"> }</a>
<span class="sourceLineNo">190</span><a id="line.190"></a>
<span class="sourceLineNo">191</span><a id="line.191"> /**</a>
<span class="sourceLineNo">192</span><a id="line.192"> * Returns the collection's contents as a string, with each element delimited by the specified</a>
<span class="sourceLineNo">193</span><a id="line.193"> * {@code delimiter} argument. Useful for {@code toString()} implementations and log messages.</a>
<span class="sourceLineNo">194</span><a id="line.194"> *</a>
<span class="sourceLineNo">195</span><a id="line.195"> * @param c the collection whose contents will be converted to a string</a>
<span class="sourceLineNo">196</span><a id="line.196"> * @param delimiter the delimiter to use between each element</a>
<span class="sourceLineNo">197</span><a id="line.197"> * @return a single string, delimited by the specified {@code delimiter}.</a>
<span class="sourceLineNo">198</span><a id="line.198"> * @since 1.2</a>
<span class="sourceLineNo">199</span><a id="line.199"> */</a>
<span class="sourceLineNo">200</span><a id="line.200"> public static String toDelimitedString(Collection c, String delimiter) {</a>
<span class="sourceLineNo">201</span><a id="line.201"> if (c == null || c.isEmpty()) {</a>
<span class="sourceLineNo">202</span><a id="line.202"> return EMPTY_STRING;</a>
<span class="sourceLineNo">203</span><a id="line.203"> }</a>
<span class="sourceLineNo">204</span><a id="line.204"> return join(c.iterator(), delimiter);</a>
<span class="sourceLineNo">205</span><a id="line.205"> }</a>
<span class="sourceLineNo">206</span><a id="line.206"></a>
<span class="sourceLineNo">207</span><a id="line.207"> /**</a>
<span class="sourceLineNo">208</span><a id="line.208"> * Tokenize the given String into a String array via a StringTokenizer.</a>
<span class="sourceLineNo">209</span><a id="line.209"> * Trims tokens and omits empty tokens.</a>
<span class="sourceLineNo">210</span><a id="line.210"> * &lt;p&gt;The given delimiters string is supposed to consist of any number of</a>
<span class="sourceLineNo">211</span><a id="line.211"> * delimiter characters. Each of those characters can be used to separate</a>
<span class="sourceLineNo">212</span><a id="line.212"> * tokens. A delimiter is always a single character; for multi-character</a>
<span class="sourceLineNo">213</span><a id="line.213"> * delimiters, consider using &lt;code&gt;delimitedListToStringArray&lt;/code&gt;</a>
<span class="sourceLineNo">214</span><a id="line.214"> * &lt;p/&gt;</a>
<span class="sourceLineNo">215</span><a id="line.215"> * &lt;p&gt;Copied from the Spring Framework while retaining all license, copyright and author information.</a>
<span class="sourceLineNo">216</span><a id="line.216"> *</a>
<span class="sourceLineNo">217</span><a id="line.217"> * @param str the String to tokenize</a>
<span class="sourceLineNo">218</span><a id="line.218"> * @param delimiters the delimiter characters, assembled as String</a>
<span class="sourceLineNo">219</span><a id="line.219"> * (each of those characters is individually considered as delimiter).</a>
<span class="sourceLineNo">220</span><a id="line.220"> * @return an array of the tokens</a>
<span class="sourceLineNo">221</span><a id="line.221"> * @see java.util.StringTokenizer</a>
<span class="sourceLineNo">222</span><a id="line.222"> * @see java.lang.String#trim()</a>
<span class="sourceLineNo">223</span><a id="line.223"> */</a>
<span class="sourceLineNo">224</span><a id="line.224"> public static String[] tokenizeToStringArray(String str, String delimiters) {</a>
<span class="sourceLineNo">225</span><a id="line.225"> return tokenizeToStringArray(str, delimiters, true, true);</a>
<span class="sourceLineNo">226</span><a id="line.226"> }</a>
<span class="sourceLineNo">227</span><a id="line.227"></a>
<span class="sourceLineNo">228</span><a id="line.228"> /**</a>
<span class="sourceLineNo">229</span><a id="line.229"> * Tokenize the given String into a String array via a StringTokenizer.</a>
<span class="sourceLineNo">230</span><a id="line.230"> * &lt;p&gt;The given delimiters string is supposed to consist of any number of</a>
<span class="sourceLineNo">231</span><a id="line.231"> * delimiter characters. Each of those characters can be used to separate</a>
<span class="sourceLineNo">232</span><a id="line.232"> * tokens. A delimiter is always a single character; for multi-character</a>
<span class="sourceLineNo">233</span><a id="line.233"> * delimiters, consider using &lt;code&gt;delimitedListToStringArray&lt;/code&gt;</a>
<span class="sourceLineNo">234</span><a id="line.234"> * &lt;p/&gt;</a>
<span class="sourceLineNo">235</span><a id="line.235"> * &lt;p&gt;Copied from the Spring Framework while retaining all license, copyright and author information.</a>
<span class="sourceLineNo">236</span><a id="line.236"> *</a>
<span class="sourceLineNo">237</span><a id="line.237"> * @param str the String to tokenize</a>
<span class="sourceLineNo">238</span><a id="line.238"> * @param delimiters the delimiter characters, assembled as String</a>
<span class="sourceLineNo">239</span><a id="line.239"> * (each of those characters is individually considered as delimiter)</a>
<span class="sourceLineNo">240</span><a id="line.240"> * @param trimTokens trim the tokens via String's &lt;code&gt;trim&lt;/code&gt;</a>
<span class="sourceLineNo">241</span><a id="line.241"> * @param ignoreEmptyTokens omit empty tokens from the result array</a>
<span class="sourceLineNo">242</span><a id="line.242"> * (only applies to tokens that are empty after trimming; StringTokenizer</a>
<span class="sourceLineNo">243</span><a id="line.243"> * will not consider subsequent delimiters as token in the first place).</a>
<span class="sourceLineNo">244</span><a id="line.244"> * @return an array of the tokens (&lt;code&gt;null&lt;/code&gt; if the input String</a>
<span class="sourceLineNo">245</span><a id="line.245"> * was &lt;code&gt;null&lt;/code&gt;)</a>
<span class="sourceLineNo">246</span><a id="line.246"> * @see java.util.StringTokenizer</a>
<span class="sourceLineNo">247</span><a id="line.247"> * @see java.lang.String#trim()</a>
<span class="sourceLineNo">248</span><a id="line.248"> */</a>
<span class="sourceLineNo">249</span><a id="line.249"> @SuppressWarnings({"unchecked"})</a>
<span class="sourceLineNo">250</span><a id="line.250"> public static String[] tokenizeToStringArray(</a>
<span class="sourceLineNo">251</span><a id="line.251"> String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens) {</a>
<span class="sourceLineNo">252</span><a id="line.252"></a>
<span class="sourceLineNo">253</span><a id="line.253"> if (str == null) {</a>
<span class="sourceLineNo">254</span><a id="line.254"> return null;</a>
<span class="sourceLineNo">255</span><a id="line.255"> }</a>
<span class="sourceLineNo">256</span><a id="line.256"> StringTokenizer st = new StringTokenizer(str, delimiters);</a>
<span class="sourceLineNo">257</span><a id="line.257"> List tokens = new ArrayList();</a>
<span class="sourceLineNo">258</span><a id="line.258"> while (st.hasMoreTokens()) {</a>
<span class="sourceLineNo">259</span><a id="line.259"> String token = st.nextToken();</a>
<span class="sourceLineNo">260</span><a id="line.260"> if (trimTokens) {</a>
<span class="sourceLineNo">261</span><a id="line.261"> token = token.trim();</a>
<span class="sourceLineNo">262</span><a id="line.262"> }</a>
<span class="sourceLineNo">263</span><a id="line.263"> if (!ignoreEmptyTokens || token.length() &gt; 0) {</a>
<span class="sourceLineNo">264</span><a id="line.264"> tokens.add(token);</a>
<span class="sourceLineNo">265</span><a id="line.265"> }</a>
<span class="sourceLineNo">266</span><a id="line.266"> }</a>
<span class="sourceLineNo">267</span><a id="line.267"> return toStringArray(tokens);</a>
<span class="sourceLineNo">268</span><a id="line.268"> }</a>
<span class="sourceLineNo">269</span><a id="line.269"></a>
<span class="sourceLineNo">270</span><a id="line.270"> /**</a>
<span class="sourceLineNo">271</span><a id="line.271"> * Copy the given Collection into a String array.</a>
<span class="sourceLineNo">272</span><a id="line.272"> * The Collection must contain String elements only.</a>
<span class="sourceLineNo">273</span><a id="line.273"> * &lt;p/&gt;</a>
<span class="sourceLineNo">274</span><a id="line.274"> * &lt;p&gt;Copied from the Spring Framework while retaining all license, copyright and author information.</a>
<span class="sourceLineNo">275</span><a id="line.275"> *</a>
<span class="sourceLineNo">276</span><a id="line.276"> * @param collection the Collection to copy</a>
<span class="sourceLineNo">277</span><a id="line.277"> * @return the String array (&lt;code&gt;null&lt;/code&gt; if the passed-in</a>
<span class="sourceLineNo">278</span><a id="line.278"> * Collection was &lt;code&gt;null&lt;/code&gt;)</a>
<span class="sourceLineNo">279</span><a id="line.279"> */</a>
<span class="sourceLineNo">280</span><a id="line.280"> @SuppressWarnings({"unchecked"})</a>
<span class="sourceLineNo">281</span><a id="line.281"> public static String[] toStringArray(Collection collection) {</a>
<span class="sourceLineNo">282</span><a id="line.282"> if (collection == null) {</a>
<span class="sourceLineNo">283</span><a id="line.283"> return null;</a>
<span class="sourceLineNo">284</span><a id="line.284"> }</a>
<span class="sourceLineNo">285</span><a id="line.285"> return (String[]) collection.toArray(new String[collection.size()]);</a>
<span class="sourceLineNo">286</span><a id="line.286"> }</a>
<span class="sourceLineNo">287</span><a id="line.287"></a>
<span class="sourceLineNo">288</span><a id="line.288"> public static String[] splitKeyValue(String aLine) throws ParseException {</a>
<span class="sourceLineNo">289</span><a id="line.289"> String line = clean(aLine);</a>
<span class="sourceLineNo">290</span><a id="line.290"> if (line == null) {</a>
<span class="sourceLineNo">291</span><a id="line.291"> return null;</a>
<span class="sourceLineNo">292</span><a id="line.292"> }</a>
<span class="sourceLineNo">293</span><a id="line.293"> String[] split = line.split(" ", 2);</a>
<span class="sourceLineNo">294</span><a id="line.294"> if (split.length != 2) {</a>
<span class="sourceLineNo">295</span><a id="line.295"> //fallback to checking for an equals sign</a>
<span class="sourceLineNo">296</span><a id="line.296"> split = line.split("=", 2);</a>
<span class="sourceLineNo">297</span><a id="line.297"> if (split.length != 2) {</a>
<span class="sourceLineNo">298</span><a id="line.298"> String msg = "Unable to determine Key/Value pair from line [" + line + "]. There is no space from " +</a>
<span class="sourceLineNo">299</span><a id="line.299"> "which the split location could be determined.";</a>
<span class="sourceLineNo">300</span><a id="line.300"> throw new ParseException(msg, 0);</a>
<span class="sourceLineNo">301</span><a id="line.301"> }</a>
<span class="sourceLineNo">302</span><a id="line.302"></a>
<span class="sourceLineNo">303</span><a id="line.303"> }</a>
<span class="sourceLineNo">304</span><a id="line.304"></a>
<span class="sourceLineNo">305</span><a id="line.305"> split[0] = clean(split[0]);</a>
<span class="sourceLineNo">306</span><a id="line.306"> split[1] = clean(split[1]);</a>
<span class="sourceLineNo">307</span><a id="line.307"> if (split[1].startsWith("=")) {</a>
<span class="sourceLineNo">308</span><a id="line.308"> //they used spaces followed by an equals followed by zero or more spaces to split the key/value pair, so</a>
<span class="sourceLineNo">309</span><a id="line.309"> //remove the equals sign to result in only the key and values in the</a>
<span class="sourceLineNo">310</span><a id="line.310"> split[1] = clean(split[1].substring(1));</a>
<span class="sourceLineNo">311</span><a id="line.311"> }</a>
<span class="sourceLineNo">312</span><a id="line.312"></a>
<span class="sourceLineNo">313</span><a id="line.313"> if (split[0] == null) {</a>
<span class="sourceLineNo">314</span><a id="line.314"> String msg = "No valid key could be found in line [" + line + "] to form a key/value pair.";</a>
<span class="sourceLineNo">315</span><a id="line.315"> throw new ParseException(msg, 0);</a>
<span class="sourceLineNo">316</span><a id="line.316"> }</a>
<span class="sourceLineNo">317</span><a id="line.317"> if (split[1] == null) {</a>
<span class="sourceLineNo">318</span><a id="line.318"> String msg = "No corresponding value could be found in line [" + line + "] for key [" + split[0] + "]";</a>
<span class="sourceLineNo">319</span><a id="line.319"> throw new ParseException(msg, 0);</a>
<span class="sourceLineNo">320</span><a id="line.320"> }</a>
<span class="sourceLineNo">321</span><a id="line.321"></a>
<span class="sourceLineNo">322</span><a id="line.322"> return split;</a>
<span class="sourceLineNo">323</span><a id="line.323"> }</a>
<span class="sourceLineNo">324</span><a id="line.324"></a>
<span class="sourceLineNo">325</span><a id="line.325"> public static String[] split(String line) {</a>
<span class="sourceLineNo">326</span><a id="line.326"> return split(line, DEFAULT_DELIMITER_CHAR);</a>
<span class="sourceLineNo">327</span><a id="line.327"> }</a>
<span class="sourceLineNo">328</span><a id="line.328"></a>
<span class="sourceLineNo">329</span><a id="line.329"> public static String[] split(String line, char delimiter) {</a>
<span class="sourceLineNo">330</span><a id="line.330"> return split(line, delimiter, DEFAULT_QUOTE_CHAR);</a>
<span class="sourceLineNo">331</span><a id="line.331"> }</a>
<span class="sourceLineNo">332</span><a id="line.332"></a>
<span class="sourceLineNo">333</span><a id="line.333"> public static String[] split(String line, char delimiter, char quoteChar) {</a>
<span class="sourceLineNo">334</span><a id="line.334"> return split(line, delimiter, quoteChar, quoteChar);</a>
<span class="sourceLineNo">335</span><a id="line.335"> }</a>
<span class="sourceLineNo">336</span><a id="line.336"></a>
<span class="sourceLineNo">337</span><a id="line.337"> public static String[] split(String line, char delimiter, char beginQuoteChar, char endQuoteChar) {</a>
<span class="sourceLineNo">338</span><a id="line.338"> return split(line, delimiter, beginQuoteChar, endQuoteChar, false, true);</a>
<span class="sourceLineNo">339</span><a id="line.339"> }</a>
<span class="sourceLineNo">340</span><a id="line.340"></a>
<span class="sourceLineNo">341</span><a id="line.341"> /**</a>
<span class="sourceLineNo">342</span><a id="line.342"> * Splits the specified delimited String into tokens, supporting quoted tokens so that quoted strings themselves</a>
<span class="sourceLineNo">343</span><a id="line.343"> * won't be tokenized.</a>
<span class="sourceLineNo">344</span><a id="line.344"> * &lt;p/&gt;</a>
<span class="sourceLineNo">345</span><a id="line.345"> * This method's implementation is very loosely based (with significant modifications) on</a>
<span class="sourceLineNo">346</span><a id="line.346"> * &lt;a href="http://blogs.bytecode.com.au/glen"&gt;Glen Smith&lt;/a&gt;'s open-source</a>
<span class="sourceLineNo">347</span><a id="line.347"> * &lt;a href="http://opencsv.svn.sourceforge.net/viewvc/opencsv/trunk/src/au/com/bytecode/opencsv/CSVReader.java?&amp;view=markup"&gt;CSVReader.java&lt;/a&gt;</a>
<span class="sourceLineNo">348</span><a id="line.348"> * file.</a>
<span class="sourceLineNo">349</span><a id="line.349"> * &lt;p/&gt;</a>
<span class="sourceLineNo">350</span><a id="line.350"> * That file is Apache 2.0 licensed as well, making Glen's code a great starting point for us to modify to</a>
<span class="sourceLineNo">351</span><a id="line.351"> * our needs.</a>
<span class="sourceLineNo">352</span><a id="line.352"> *</a>
<span class="sourceLineNo">353</span><a id="line.353"> * @param aLine the String to parse</a>
<span class="sourceLineNo">354</span><a id="line.354"> * @param delimiter the delimiter by which the &lt;tt&gt;line&lt;/tt&gt; argument is to be split</a>
<span class="sourceLineNo">355</span><a id="line.355"> * @param beginQuoteChar the character signifying the start of quoted text (so the quoted text will not be split)</a>
<span class="sourceLineNo">356</span><a id="line.356"> * @param endQuoteChar the character signifying the end of quoted text</a>
<span class="sourceLineNo">357</span><a id="line.357"> * @param retainQuotes if the quotes themselves should be retained when constructing the corresponding token</a>
<span class="sourceLineNo">358</span><a id="line.358"> * @param trimTokens if leading and trailing whitespace should be trimmed from discovered tokens.</a>
<span class="sourceLineNo">359</span><a id="line.359"> * @return the tokens discovered from parsing the given delimited &lt;tt&gt;line&lt;/tt&gt;.</a>
<span class="sourceLineNo">360</span><a id="line.360"> */</a>
<span class="sourceLineNo">361</span><a id="line.361"> public static String[] split(String aLine, char delimiter, char beginQuoteChar, char endQuoteChar,</a>
<span class="sourceLineNo">362</span><a id="line.362"> boolean retainQuotes, boolean trimTokens) {</a>
<span class="sourceLineNo">363</span><a id="line.363"> String line = clean(aLine);</a>
<span class="sourceLineNo">364</span><a id="line.364"> if (line == null) {</a>
<span class="sourceLineNo">365</span><a id="line.365"> return null;</a>
<span class="sourceLineNo">366</span><a id="line.366"> }</a>
<span class="sourceLineNo">367</span><a id="line.367"></a>
<span class="sourceLineNo">368</span><a id="line.368"> List&lt;String&gt; tokens = new ArrayList&lt;String&gt;();</a>
<span class="sourceLineNo">369</span><a id="line.369"> StringBuilder sb = new StringBuilder();</a>
<span class="sourceLineNo">370</span><a id="line.370"> boolean inQuotes = false;</a>
<span class="sourceLineNo">371</span><a id="line.371"></a>
<span class="sourceLineNo">372</span><a id="line.372"> for (int i = 0; i &lt; line.length(); i++) {</a>
<span class="sourceLineNo">373</span><a id="line.373"></a>
<span class="sourceLineNo">374</span><a id="line.374"> char c = line.charAt(i);</a>
<span class="sourceLineNo">375</span><a id="line.375"> if (c == beginQuoteChar) {</a>
<span class="sourceLineNo">376</span><a id="line.376"> // this gets complex... the quote may end a quoted block, or escape another quote.</a>
<span class="sourceLineNo">377</span><a id="line.377"> // do a 1-char lookahead:</a>
<span class="sourceLineNo">378</span><a id="line.378"> if (inQuotes // we are in quotes, therefore there can be escaped quotes in here.</a>
<span class="sourceLineNo">379</span><a id="line.379"> &amp;&amp; line.length() &gt; (i + 1) // there is indeed another character to check.</a>
<span class="sourceLineNo">380</span><a id="line.380"> &amp;&amp; line.charAt(i + 1) == beginQuoteChar) { // ..and that char. is a quote also.</a>
<span class="sourceLineNo">381</span><a id="line.381"> // we have two quote chars in a row == one quote char, so consume them both and</a>
<span class="sourceLineNo">382</span><a id="line.382"> // put one on the token. we do *not* exit the quoted text.</a>
<span class="sourceLineNo">383</span><a id="line.383"> sb.append(line.charAt(i + 1));</a>
<span class="sourceLineNo">384</span><a id="line.384"> i++;</a>
<span class="sourceLineNo">385</span><a id="line.385"> } else {</a>
<span class="sourceLineNo">386</span><a id="line.386"> inQuotes = !inQuotes;</a>
<span class="sourceLineNo">387</span><a id="line.387"> if (retainQuotes) {</a>
<span class="sourceLineNo">388</span><a id="line.388"> sb.append(c);</a>
<span class="sourceLineNo">389</span><a id="line.389"> }</a>
<span class="sourceLineNo">390</span><a id="line.390"> }</a>
<span class="sourceLineNo">391</span><a id="line.391"> } else if (c == endQuoteChar) {</a>
<span class="sourceLineNo">392</span><a id="line.392"> inQuotes = !inQuotes;</a>
<span class="sourceLineNo">393</span><a id="line.393"> if (retainQuotes) {</a>
<span class="sourceLineNo">394</span><a id="line.394"> sb.append(c);</a>
<span class="sourceLineNo">395</span><a id="line.395"> }</a>
<span class="sourceLineNo">396</span><a id="line.396"> } else if (c == delimiter &amp;&amp; !inQuotes) {</a>
<span class="sourceLineNo">397</span><a id="line.397"> String s = sb.toString();</a>
<span class="sourceLineNo">398</span><a id="line.398"> if (trimTokens) {</a>
<span class="sourceLineNo">399</span><a id="line.399"> s = s.trim();</a>
<span class="sourceLineNo">400</span><a id="line.400"> }</a>
<span class="sourceLineNo">401</span><a id="line.401"> tokens.add(s);</a>
<span class="sourceLineNo">402</span><a id="line.402"> sb = new StringBuilder(); // start work on next token</a>
<span class="sourceLineNo">403</span><a id="line.403"> } else {</a>
<span class="sourceLineNo">404</span><a id="line.404"> sb.append(c);</a>
<span class="sourceLineNo">405</span><a id="line.405"> }</a>
<span class="sourceLineNo">406</span><a id="line.406"> }</a>
<span class="sourceLineNo">407</span><a id="line.407"> String s = sb.toString();</a>
<span class="sourceLineNo">408</span><a id="line.408"> if (trimTokens) {</a>
<span class="sourceLineNo">409</span><a id="line.409"> s = s.trim();</a>
<span class="sourceLineNo">410</span><a id="line.410"> }</a>
<span class="sourceLineNo">411</span><a id="line.411"> tokens.add(s);</a>
<span class="sourceLineNo">412</span><a id="line.412"> return tokens.toArray(new String[tokens.size()]);</a>
<span class="sourceLineNo">413</span><a id="line.413"> }</a>
<span class="sourceLineNo">414</span><a id="line.414"></a>
<span class="sourceLineNo">415</span><a id="line.415"> /**</a>
<span class="sourceLineNo">416</span><a id="line.416"> * Joins the elements of the provided {@code Iterator} into</a>
<span class="sourceLineNo">417</span><a id="line.417"> * a single String containing the provided elements.&lt;/p&gt;</a>
<span class="sourceLineNo">418</span><a id="line.418"> * &lt;p/&gt;</a>
<span class="sourceLineNo">419</span><a id="line.419"> * No delimiter is added before or after the list.</a>
<span class="sourceLineNo">420</span><a id="line.420"> * A {@code null} separator is the same as an empty String ("").&lt;/p&gt;</a>
<span class="sourceLineNo">421</span><a id="line.421"> * &lt;p/&gt;</a>
<span class="sourceLineNo">422</span><a id="line.422"> * Copied from Commons Lang, version 3 (r1138702).&lt;/p&gt;</a>
<span class="sourceLineNo">423</span><a id="line.423"> *</a>
<span class="sourceLineNo">424</span><a id="line.424"> * @param iterator the {@code Iterator} of values to join together, may be null</a>
<span class="sourceLineNo">425</span><a id="line.425"> * @param separator the separator character to use, null treated as ""</a>
<span class="sourceLineNo">426</span><a id="line.426"> * @return the joined String, {@code null} if null iterator input</a>
<span class="sourceLineNo">427</span><a id="line.427"> * @since 1.2</a>
<span class="sourceLineNo">428</span><a id="line.428"> */</a>
<span class="sourceLineNo">429</span><a id="line.429"> public static String join(Iterator&lt;?&gt; iterator, String separator) {</a>
<span class="sourceLineNo">430</span><a id="line.430"> final String empty = "";</a>
<span class="sourceLineNo">431</span><a id="line.431"></a>
<span class="sourceLineNo">432</span><a id="line.432"> // handle null, zero and one elements before building a buffer</a>
<span class="sourceLineNo">433</span><a id="line.433"> if (iterator == null) {</a>
<span class="sourceLineNo">434</span><a id="line.434"> return null;</a>
<span class="sourceLineNo">435</span><a id="line.435"> }</a>
<span class="sourceLineNo">436</span><a id="line.436"> if (!iterator.hasNext()) {</a>
<span class="sourceLineNo">437</span><a id="line.437"> return empty;</a>
<span class="sourceLineNo">438</span><a id="line.438"> }</a>
<span class="sourceLineNo">439</span><a id="line.439"> Object first = iterator.next();</a>
<span class="sourceLineNo">440</span><a id="line.440"> if (!iterator.hasNext()) {</a>
<span class="sourceLineNo">441</span><a id="line.441"> return first == null ? empty : first.toString();</a>
<span class="sourceLineNo">442</span><a id="line.442"> }</a>
<span class="sourceLineNo">443</span><a id="line.443"></a>
<span class="sourceLineNo">444</span><a id="line.444"> // two or more elements</a>
<span class="sourceLineNo">445</span><a id="line.445"> StringBuilder buf = new StringBuilder(256); // Java default is 16, probably too small</a>
<span class="sourceLineNo">446</span><a id="line.446"> if (first != null) {</a>
<span class="sourceLineNo">447</span><a id="line.447"> buf.append(first);</a>
<span class="sourceLineNo">448</span><a id="line.448"> }</a>
<span class="sourceLineNo">449</span><a id="line.449"></a>
<span class="sourceLineNo">450</span><a id="line.450"> while (iterator.hasNext()) {</a>
<span class="sourceLineNo">451</span><a id="line.451"> if (separator != null) {</a>
<span class="sourceLineNo">452</span><a id="line.452"> buf.append(separator);</a>
<span class="sourceLineNo">453</span><a id="line.453"> }</a>
<span class="sourceLineNo">454</span><a id="line.454"> Object obj = iterator.next();</a>
<span class="sourceLineNo">455</span><a id="line.455"> if (obj != null) {</a>
<span class="sourceLineNo">456</span><a id="line.456"> buf.append(obj);</a>
<span class="sourceLineNo">457</span><a id="line.457"> }</a>
<span class="sourceLineNo">458</span><a id="line.458"> }</a>
<span class="sourceLineNo">459</span><a id="line.459"> return buf.toString();</a>
<span class="sourceLineNo">460</span><a id="line.460"> }</a>
<span class="sourceLineNo">461</span><a id="line.461"></a>
<span class="sourceLineNo">462</span><a id="line.462"> /**</a>
<span class="sourceLineNo">463</span><a id="line.463"> * Splits the {@code delimited} string (delimited by the specified {@code separator} character) and returns the</a>
<span class="sourceLineNo">464</span><a id="line.464"> * delimited values as a {@code Set}.</a>
<span class="sourceLineNo">465</span><a id="line.465"> * &lt;p/&gt;</a>
<span class="sourceLineNo">466</span><a id="line.466"> * If either argument is {@code null}, this method returns {@code null}.</a>
<span class="sourceLineNo">467</span><a id="line.467"> *</a>
<span class="sourceLineNo">468</span><a id="line.468"> * @param delimited the string to split</a>
<span class="sourceLineNo">469</span><a id="line.469"> * @param separator the character that delineates individual tokens to split</a>
<span class="sourceLineNo">470</span><a id="line.470"> * @return the delimited values as a {@code Set}.</a>
<span class="sourceLineNo">471</span><a id="line.471"> * @since 1.2</a>
<span class="sourceLineNo">472</span><a id="line.472"> */</a>
<span class="sourceLineNo">473</span><a id="line.473"> public static Set&lt;String&gt; splitToSet(String delimited, String separator) {</a>
<span class="sourceLineNo">474</span><a id="line.474"> if (delimited == null || separator == null) {</a>
<span class="sourceLineNo">475</span><a id="line.475"> return null;</a>
<span class="sourceLineNo">476</span><a id="line.476"> }</a>
<span class="sourceLineNo">477</span><a id="line.477"> String[] split = split(delimited, separator.charAt(0));</a>
<span class="sourceLineNo">478</span><a id="line.478"> return asSet(split);</a>
<span class="sourceLineNo">479</span><a id="line.479"> }</a>
<span class="sourceLineNo">480</span><a id="line.480"></a>
<span class="sourceLineNo">481</span><a id="line.481"> /**</a>
<span class="sourceLineNo">482</span><a id="line.482"> * Returns the input argument, but ensures the first character is capitalized (if possible).</a>
<span class="sourceLineNo">483</span><a id="line.483"> * @param in the string to uppercase the first character.</a>
<span class="sourceLineNo">484</span><a id="line.484"> * @return the input argument, but with the first character capitalized (if possible).</a>
<span class="sourceLineNo">485</span><a id="line.485"> * @since 1.2</a>
<span class="sourceLineNo">486</span><a id="line.486"> */</a>
<span class="sourceLineNo">487</span><a id="line.487"> public static String uppercaseFirstChar(String in) {</a>
<span class="sourceLineNo">488</span><a id="line.488"> if (in == null || in.length() == 0) {</a>
<span class="sourceLineNo">489</span><a id="line.489"> return in;</a>
<span class="sourceLineNo">490</span><a id="line.490"> }</a>
<span class="sourceLineNo">491</span><a id="line.491"> int length = in.length();</a>
<span class="sourceLineNo">492</span><a id="line.492"> StringBuilder sb = new StringBuilder(length);</a>
<span class="sourceLineNo">493</span><a id="line.493"></a>
<span class="sourceLineNo">494</span><a id="line.494"> sb.append(Character.toUpperCase(in.charAt(0)));</a>
<span class="sourceLineNo">495</span><a id="line.495"> if (length &gt; 1) {</a>
<span class="sourceLineNo">496</span><a id="line.496"> String remaining = in.substring(1);</a>
<span class="sourceLineNo">497</span><a id="line.497"> sb.append(remaining);</a>
<span class="sourceLineNo">498</span><a id="line.498"> }</a>
<span class="sourceLineNo">499</span><a id="line.499"> return sb.toString();</a>
<span class="sourceLineNo">500</span><a id="line.500"> }</a>
<span class="sourceLineNo">501</span><a id="line.501"></a>
<span class="sourceLineNo">502</span><a id="line.502"> //////////////////////////</a>
<span class="sourceLineNo">503</span><a id="line.503"> // From CollectionUtils //</a>
<span class="sourceLineNo">504</span><a id="line.504"> //////////////////////////</a>
<span class="sourceLineNo">505</span><a id="line.505"> // CollectionUtils cannot be removed from shiro-core until 2.0 as it has a dependency on PrincipalCollection</a>
<span class="sourceLineNo">506</span><a id="line.506"></a>
<span class="sourceLineNo">507</span><a id="line.507"></a>
<span class="sourceLineNo">508</span><a id="line.508"> private static &lt;E&gt; Set&lt;E&gt; asSet(E... elements) {</a>
<span class="sourceLineNo">509</span><a id="line.509"> if (elements == null || elements.length == 0) {</a>
<span class="sourceLineNo">510</span><a id="line.510"> return Collections.emptySet();</a>
<span class="sourceLineNo">511</span><a id="line.511"> }</a>
<span class="sourceLineNo">512</span><a id="line.512"></a>
<span class="sourceLineNo">513</span><a id="line.513"> if (elements.length == 1) {</a>
<span class="sourceLineNo">514</span><a id="line.514"> return Collections.singleton(elements[0]);</a>
<span class="sourceLineNo">515</span><a id="line.515"> }</a>
<span class="sourceLineNo">516</span><a id="line.516"></a>
<span class="sourceLineNo">517</span><a id="line.517"> LinkedHashSet&lt;E&gt; set = new LinkedHashSet&lt;E&gt;(elements.length * 4 / 3 + 1);</a>
<span class="sourceLineNo">518</span><a id="line.518"> Collections.addAll(set, elements);</a>
<span class="sourceLineNo">519</span><a id="line.519"> return set;</a>
<span class="sourceLineNo">520</span><a id="line.520"> }</a>
<span class="sourceLineNo">521</span><a id="line.521"></a>
<span class="sourceLineNo">522</span><a id="line.522">}</a>
</pre>
</div>
</main>
</body>
</html>