001/*
002  GRANITE DATA SERVICES
003  Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004
005  This file is part of Granite Data Services.
006
007  Granite Data Services is free software; you can redistribute it and/or modify
008  it under the terms of the GNU Library General Public License as published by
009  the Free Software Foundation; either version 2 of the License, or (at your
010  option) any later version.
011
012  Granite Data Services is distributed in the hope that it will be useful, but
013  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015  for more details.
016
017  You should have received a copy of the GNU Library General Public License
018  along with this library; if not, see <http://www.gnu.org/licenses/>.
019*/
020
021package org.granite.builder.util;
022
023import java.util.regex.Pattern;
024
025/**
026 * @author Franck WOLFF
027 */
028public class StringUtil {
029        
030        public static String unNull(String s) {
031                return s == null ? "" : s;
032        }
033    
034    public static String defaultText(String s, String def) {
035        return (s == null || s.length() == 0 ? def : s);
036    }
037
038        public static String tokenize(String s, int max, String delimiter) {
039                
040                if (max <= 0 || s == null || s.length() < max)
041                        return s;
042
043                StringBuilder sb = new StringBuilder();
044                
045                int length = 0;
046                for (String token : s.split("\\s", -1)) {
047                        if (length > 0) {
048                                if (length + token.length() >= max) {
049                                        sb.append(delimiter);
050                                        length = 0;
051                                }
052                                else {
053                                        sb.append(' ');
054                                        length++;
055                                }
056                        }
057                        sb.append(token);
058                        length += token.length();
059                }
060                
061                return sb.toString();
062        }
063        
064        public static String join(String[] items, char separator) {
065                return join(items, String.valueOf(separator));
066        }
067        
068        public static String join(String[] items, String separator) {
069                StringBuilder sb = new StringBuilder();
070                for (String item : items) {
071                        if (sb.length() > 0)
072                                sb.append(separator);
073                        sb.append(item);
074                }
075                return sb.toString();
076        }
077        
078        public static String[] split(String items, char separator) {
079                return split(items, String.valueOf(separator));
080        }
081        
082        public static String[] split(String items, String separator) {
083                return items.split(Pattern.quote(separator), -1);
084        }
085        
086        public static String regexifyPathPattern(String pattern) {
087                StringBuilder sb = new StringBuilder();
088                
089                boolean quote = false;
090                sb.append('^');
091                for (int i = 0; i < pattern.length(); i++) {
092                        char c = pattern.charAt(i);
093                        switch (c) {
094                        case '*':
095                                if (quote) {
096                                        sb.append("\\E");
097                                        quote = false;
098                                }
099                                // Double star (any character even the path separator '/').
100                                if (i + 1 < pattern.length() && pattern.charAt(i + 1) == '*') {
101                                        sb.append(".*");
102                                        i++;
103                                }
104                                // Single star (any character except '/').
105                                else
106                                        sb.append("[^/]*");
107                                break;
108                        case '?':
109                                if (quote) {
110                                        sb.append("\\E");
111                                        quote = false;
112                                }
113                                sb.append("[^/]");
114                                break;
115                        default:
116                                if (!quote) {
117                                        sb.append("\\Q");
118                                        quote = true;
119                                }
120                                sb.append(c);
121                                break;
122                        }
123                }
124                if (quote)
125                        sb.append("\\E");
126                sb.append('$');
127                
128                return sb.toString();
129        }
130}