001package ezvcard.util;
002
003import java.util.Collection;
004import java.util.HashMap;
005import java.util.Map;
006
007/*
008 Copyright (c) 2012-2023, Michael Angstadt
009 All rights reserved.
010
011 Redistribution and use in source and binary forms, with or without
012 modification, are permitted provided that the following conditions are met: 
013
014 1. Redistributions of source code must retain the above copyright notice, this
015 list of conditions and the following disclaimer. 
016 2. Redistributions in binary form must reproduce the above copyright notice,
017 this list of conditions and the following disclaimer in the documentation
018 and/or other materials provided with the distribution. 
019
020 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
021 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
022 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
023 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
024 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
025 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
026 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
027 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
028 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
029 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
030
031 The views and conclusions contained in the software and documentation are those
032 of the authors and should not be interpreted as representing official policies, 
033 either expressed or implied, of the FreeBSD Project.
034 */
035
036/**
037 * Helper class for dealing with strings.
038 * @author Michael Angstadt
039 */
040public final class StringUtils {
041        /**
042         * The local computer's newline character sequence.
043         */
044        public static final String NEWLINE = System.getProperty("line.separator");
045
046        /**
047         * Joins a collection of values into a delimited list.
048         * @param collection the collection of values
049         * @param delimiter the delimiter (e.g. ",")
050         * @return the delimited string
051         */
052        public static String join(Collection<?> collection, String delimiter) {
053                StringBuilder sb = new StringBuilder();
054
055                boolean first = true;
056                for (Object value : collection) {
057                        if (!first) {
058                                sb.append(delimiter);
059                        }
060
061                        sb.append(value);
062                        first = false;
063                }
064
065                return sb.toString();
066        }
067
068        /**
069         * Creates a copy of the given map, converting its keys and values to
070         * lowercase.
071         * @param map the map
072         * @return the copy with lowercase keys and values
073         */
074        public static Map<String, String> toLowerCase(Map<String, String> map) {
075                Map<String, String> lowerCaseMap = new HashMap<>(map.size());
076                for (Map.Entry<String, String> entry : map.entrySet()) {
077                        String key = entry.getKey();
078                        key = (key == null) ? null : key.toLowerCase();
079
080                        String value = entry.getValue();
081                        value = (value == null) ? null : value.toLowerCase();
082
083                        lowerCaseMap.put(key, value);
084                }
085                return lowerCaseMap;
086        }
087
088        private StringUtils() {
089                //hide
090        }
091}