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}