dirkv 2004/03/21 13:10:18 Modified: scaffold/src/java/org/apache/commons/scaffold/text ConvertUtils.java Merge.java Log: Bugzilla Bug 27689: [scaffold] changing to the Apache 2.0 license removed source file contents. Revision Changes Path 1.11 +1007 -15 jakarta-commons-sandbox/scaffold/src/java/org/apache/commons/scaffold/text/ConvertUtils.java Index: ConvertUtils.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/scaffold/src/java/org/apache/commons/scaffold/text/ConvertUtils.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- ConvertUtils.java 28 Feb 2004 03:35:45 -0000 1.10 +++ ConvertUtils.java 21 Mar 2004 21:10:18 -0000 1.11 @@ -1,5 +1,20 @@ -package org.apache.commons.scaffold.text; +/* + * Copyright 2002,2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.scaffold.text; import java.text.DateFormat; import java.text.DecimalFormat; @@ -19,19 +34,996 @@ import java.sql.Timestamp; +/** + * An <b>experimental</b> class with some standard conversion + * utilities. Needs more proof of concept and unit testing. + * + * @author Ted Husted + * @author OK State DEQ + * @author WXXI Public Broadcasting Council + * @version $Revision$ $Date$ + */ +public class ConvertUtils { /* - * Copyright 2002,2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ + protected Locale[] availableLocales = null; + public static Locale[] getAvailableLocales() { + return availableLocales; + } + public static void setAvailableLocales(Locale[] _availableLocales) { + availableLocales = _availableLocales; + } + +*/ + + + /** + * This is an all-static utility class. + * A private constructor prevents inadvertent instantiation. + */ + private ConvertUtils() { + ; // empty + } + + +// ---------------------------------------------------- Text Separators + + /** + * An empty string. + */ + public static String STRING_EMPTY = ""; + + + /** + * An empty string. + * @deprecated Use STRING_EMPTY + */ + public static String EMPTY_STRING = STRING_EMPTY; + + + /** + * An single-space string. + */ + public static final String STRING_SPACE = " "; + + + /** + * Space character. + */ + public static final char SPACE = ' '; + + + /** + * Horizontal tab character. + */ + public static final char HORIZONTAL_TABULATION = '\t'; // (aka u0009) + + + /** + * Line feed character. + */ + public static final char LINE_FEED = '\r'; // (aka u000A); + + + /** + * Vertical tab character. + */ + public static final char VERTICAL_TABULATION = '\u000B'; + + + /** + * Form feed character. + */ + public static final char FORM_FEED = '\u000C'; + + + /** + * Carriage return character. + */ + public static final char CARRIAGE_RETURN = '\n'; // (aka u000D) + + + /** + * File separator character. + */ + public static final char FILE_SEPARATOR = '\u001C'; + + + /** + * Group separator character. + */ + public static final char GROUP_SEPARATOR = '\u001D'; + + + /** + * Record separator character. + */ + public static final char RECORD_SEPARATOR = '\u001E'; + + + /** + * Unit separator character. + */ + public static final char UNIT_SEPARATOR = '\u001F'; + + + /** + * Array of line separator characters. + * http://java.sun.com/j2se/1.3/docs/api/java/lang/Character.html#isWhitespace(char) + */ + public static final char[] SEPARATORS = { + HORIZONTAL_TABULATION, + LINE_FEED, + VERTICAL_TABULATION, + FORM_FEED, + CARRIAGE_RETURN, + FILE_SEPARATOR, + GROUP_SEPARATOR, + RECORD_SEPARATOR, + UNIT_SEPARATOR + }; + +// --------------------------------------------------------- Tokenizers + + + /** + * Return array of tokens, + * using the result of <code>getTokeSep()</code> as the + * separator. + * Blanks are trimmed from tokens. + * + * @param parameter The string to tokenize into an array + */ + public static String[] tokensToArray(String tokens, String separator) { + + StringTokenizer tokenizer = + new StringTokenizer(tokens,separator); + int i = 0; + String[] array = new String[tokenizer.countTokens()]; + while (tokenizer.hasMoreTokens()) { + String token = tokenizer.nextToken().trim(); + if ((token==null) || (token.length()==0)) continue; + array[i++] = token; + } + return array; + + } // end tokensToArray + + + /** + * Return list of tokens, + * using the result of <code>getTokeSep()</code> as the + * separator. + * Blanks are trimmed from tokens. + * + * @param parameter The string to tokenize into an array + */ + public static List tokensToList(String tokens, String separator) { + + StringTokenizer tokenizer = + new StringTokenizer(tokens,separator); + List list = new java.util.ArrayList(tokenizer.countTokens()); + while (tokenizer.hasMoreTokens()) { + String token = tokenizer.nextToken().trim(); + if ((token==null) || (token.length()==0)) continue; + list.add(token); + } + return list; + + } // end tokensToList + + +// ------------------------------------------------------- Text Methods + + + /** + * Returns true if null or trims to an empty string. + * @deprecated Use blank instead. + */ + public static boolean isBlank(String s) { + return blank(s); + } + + + /** + * Returns true if null or zero. + * @deprecated Use blank instead. + */ + public static boolean isBlank(Integer key) { + return blank(key); + } + + + /** + * Returns true if null or trims to an empty string. + * @deprecated Use blankValue instead. + */ + public static boolean isBlankValue(String s) { + return blankValue(s); + } + + + /** + * Returns true if null or trims to an empty string. + * @deprecated Use blank instead. + */ + public static boolean blank(String s) { + return ((null==s) || (STRING_EMPTY.equals(s.trim()))); + } + + + /** + * Returns true if null or zero. + * @deprecated Use blank instead. + */ + public static boolean blank(Number key) { + return ((null==key) || (0==key.byteValue())); + } + + + /** + * Returns true if null, trims to an empty string, + * or to "0". + */ + public static boolean blankValue(String s) { + if (null==s) return true; + String _s = s.trim(); + return ((STRING_EMPTY.equals(_s)) || (STRING_ZERO.equals(_s))); + } + + + /** + * Return a trimmed or empty string (but not null). + */ + public static String toTrimOrEmpty(String string) { + if (null==string) return STRING_EMPTY; + return string.trim(); + } + + + /** + * Returns null or a trimmed uppercase string. + */ + public static String toUpperOrNull(String string) { + if (null!=string) + return string.toUpperCase().trim(); + return null; + } + + + /** + * The token that signifies the begnning of a query string ["?"]. + */ + public static String QS_START = "?"; + + + /** + * The token that delimits two or more attributes of a query string ["&"]. + */ + public static String QS_DELIM = "&"; + + + /** + * The token that seperates an attribute name and value. + */ + public static String QS_SEP = "="; + + + /** + * Appends name=value parameter. + */ + public static String addParam(String path, String name, String value) { + StringBuffer uri = new StringBuffer(path); + boolean isQuery = (path.indexOf(QS_START)>=0); + if (isQuery) + uri.append(QS_DELIM); + else + uri.append(QS_START); + uri.append(name); + uri.append(QS_SEP); + uri.append(value); + return uri.toString(); + + } + + + /** + * Appends name=value parameters to path from Map. + */ + public static String addParams(String path, Map parameters) { + + if (null==path) path = new String(); + + if ((null==parameters) || (parameters.isEmpty())) return path; + + StringBuffer uri = new StringBuffer(path); + boolean isQuery = (path.indexOf(QS_START)>=0); + if (isQuery) + uri.append(QS_DELIM); + else + uri.append(QS_START); + + Set entries = parameters.entrySet(); + for (Iterator i = entries.iterator(); i.hasNext(); ) { + Entry e = (Entry) i.next(); + uri.append(e.getKey()); + uri.append(QS_SEP); + uri.append(e.getValue()); + } + return uri.toString(); + + } + + + /** + * Returns parameters as a series of hidden HTML fields. + */ + public static String renderHiddenFields(Map parameters) { + + if ((null==parameters) || (parameters.isEmpty())) return new String(); + + StringBuffer html = new StringBuffer(); + Set entries = parameters.entrySet(); + for (Iterator i = entries.iterator(); i.hasNext(); ) { + html.append("<input type='hidden' name='"); + Entry e = (Entry) i.next(); + html.append(e.getKey()); + html.append("' value='"); + html.append(e.getValue()); + html.append("' />"); + } + return html.toString(); + + } + + + /** + * Replace line returns with spaces. + */ + private static String stripLn(String string) { + + // :FIXME: Better way to buffer the interim strings? + for (int i=0; i<SEPARATORS.length; i++) { + string = string.replace( + SEPARATORS[i], + SPACE + ); + } + return string; + } + + + +// ----------------------------------------------------- Numeric Values + + + /** + * An Double 0. + */ + public static Double DOUBLE_ZERO = new Double(0); + + + /** + * An Double 1. + */ + public static Double DOUBLE_ONE = new Double((double) 1.0); + + + /** + * An Integer 0. + */ + public static Integer INTEGER_ZERO = new Integer(0); + + + /** + * An Integer 1. + */ + public static Integer INTEGER_ONE = new Integer(1); + + + /** + * A Short 0. + */ + public static Short SHORT_ZERO = new Short((short) 0); + + + /** + * A Short 1. + */ + public static Short SHORT_ONE = new Short((short) 1); + + + /** + * A String 0. + */ + public static String STRING_ZERO = "0"; + + + /** + * A String 1. + */ + public static String STRING_ONE = "1"; + + + + +// ---------------------------------------------------- Numeric Methods + + + /** + * Return String with of digits only (0..9). + * http://java.sun.com/j2se/1.4/docs/api/java/lang/Character.html + */ + public static String getDigits(String s) { + if (s==null) return null; + int n = s.length(); + StringBuffer sb = new StringBuffer(n); + for (int i = 0; i < n; i++) { + char c = s.charAt(i); + if (Character.isDigit(c)) sb.append(c); + } + return (sb.toString()); + } + + + /** + * Returns number formatted for default or given locale. + */ + public static String getNumber(Number value, Locale locale) { + if (locale==null) + return (NumberFormat.getInstance().format(value)); + return (NumberFormat.getInstance(locale).format(value)); + } + + + /** + * Returns percent formatted for default or given locale. + */ + public static String getPercent(Number value, Locale locale) { + if (locale==null) + return (NumberFormat.getPercentInstance().format(value)); + return (NumberFormat.getPercentInstance(locale).format(value)); + } + + + /* -- Is there a use case for this? + + public static String getInteger(Number value, Locale locale) { + if (locale==null) + return (NumberFormat.getIntegerInstance().format(value)); + return (NumberFormat.getIntegerInstance(locale).format(value)); + } + + */ + + + /* + * Returns whether the last digit of numeric string is a parity + * check on the others per the "primes of nines" method. + * Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl + * @param Number - Number to check. + * Must be all digits and not null. + */ + public static boolean luhnCheck(String number) { + int no_digit = number.length(); + int oddoeven = no_digit & 1; + long sum = 0; + for (int count = 0; count < no_digit; count++) { + int digit = Integer.parseInt( + String.valueOf(number.charAt(count))); + if ( ( (count & 1) ^ oddoeven) ==0 ) { // not + digit *= 2; + if (digit > 9) digit -= 9; + }; + sum += digit; + }; + if (sum == 0) return false; + if (sum % 10 == 0) return true; + return false; + } + + + /** + * Returns number with the appropriate digit appended + * so that is passes a "luhnCheck". + * @param Number - Number to process. + * Must be all digits and not null. + */ + public static String addLuhnDigit(String number) { + // I don't actually understand the alogorithm + // so we just use brute force to find the digit. + char[] digits = {'1','2','3','4','5','6','7','8','9','0'}; + int c = number.length(); + StringBuffer tryNumber = new StringBuffer(number + digits[0]); + int i; + for (i=0; i<10; i++) { + tryNumber.setCharAt(c,digits[i]); + if (luhnCheck(tryNumber.toString())) + break; + } + return tryNumber.toString(); + } + + +// ------------------------------------------------------------ Decimal + + + /** + * Default decimal pattern. + * http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html + */ + public static String DECIMAL_PATTERN ="###,###.###"; + + + /** + * Symbols that can be used in a decimal pattern. + */ + public static DecimalFormatSymbols getGenericDecimal(Locale locale) { + DecimalFormatSymbols symbols = + new DecimalFormatSymbols(locale); + symbols.setGroupingSeparator('`'); // :FIXME: Want apostrophe here + return symbols; + } + + + /** + * Return decimal number formatted for default or given locale. + */ + public static String getDecimal(Number value, Locale locale) { + if (locale==null) + return (DecimalFormat.getInstance().format(value)); + return (DecimalFormat.getInstance().format(value)); + } + + + /** + * Return decimal number formatted for default or given locale + * using given pattern. + */ + public static String getDecimal(Number value, Locale locale, String pattern) { + NumberFormat formatter; + if (locale==null) + formatter = new java.text.DecimalFormat(pattern); + else { + formatter = NumberFormat.getNumberInstance(locale); + DecimalFormat df = (DecimalFormat) formatter; + df.applyPattern(pattern); + return df.format(value); + } + return (formatter.format(value)); + } + + + /** + * Return decimal for default locale using standard pattern. + */ + public static String getDecimal(Number value) { + return getDecimal(value,(Locale) null,DECIMAL_PATTERN); + } + + +// ----------------------------------------------------------- Currency + + + /** + * Standard currency pattern. + * http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html + */ + public static String CURRENCY_PATTERN ="$" + DECIMAL_PATTERN; + + + /** + * Return currency for default locale using standard pattern. + */ + public static String getCurrency(Number value) { + return getDecimal(value,null,CURRENCY_PATTERN); + } + + +// --------------------------------------------------------------- Date + + + /** + * Default style for dates and times. + */ + public static int DEFAULT = DateFormat.DEFAULT; + + + /** + * Short style for dates and times. + */ + public static int SHORT = DateFormat.SHORT; + + + /** + * Medium style for dates and times. + */ + public static int MEDIUM = DateFormat.MEDIUM; + + + /** + * Long style for dates and times. + */ + public static int LONG = DateFormat.LONG; + + + /** + * Full style for dates and times. + */ + public static int FULL = DateFormat.FULL; + + + /** + * Default lenient setting for getDate. + */ + private static boolean LENIENT_DATE = false; + + + /** + * A "default" date format. + */ + public static String ESCAPE_DATE_PATTERN = "yyyy-mm-dd"; + + + /** + * Convert String to Date using given format. + * Returns null if conversion fails. + * Set lenient=false to disallow dates like 2001-9-32. + * http://java.sun.com/j2se/1.4/docs/api/java/text/SimpleDateFormat.html + * @author Hal Deadman + */ + public static Date getDate(String dateDisplay, + String format, boolean lenient) { + if (dateDisplay == null) { + return null; + } + DateFormat df = null; + try { + if (format==null) { + df = new SimpleDateFormat(); + } + else { + df = new SimpleDateFormat(format); + } + // setLenient avoids allowing dates like 9/32/2001 + // which would otherwise parse to 10/2/2001 + df.setLenient(false); + return df.parse(dateDisplay); + } + catch(ParseException e) { + return null; + } + } + + + /** + * Convert String to Date using given format. + * Returns null if conversion fails. + * Uses "strict" coNversion (lenient=false). + * @author Hal Deadman + */ + public static Date getDate(String dateDisplay, String format) { + return getDate(dateDisplay,format,LENIENT_DATE); + } + + + /** + * Convert String to Date using a medium (weekday day month year) format. + * Returns null if conversion fails. + * Uses "strict" coNversion (lenient=false). + * @author Hal Deadman + */ + public static Date getDate(String dateDisplay) { + return getDate(dateDisplay,null,LENIENT_DATE); + } + + + /** + * Return Date value using a String. + * Null or conversion error returns null. + * @param String representing Date + */ + public static Date toDate(String string) { + if (string==null) + return null; + else try { + return getDate(string); + } catch (Throwable t) { + return null; + } + } + + + /** + * Convert date to String for given locale in given style. + * A null locale will return the default locale. + */ + public static String getDate(Date date, Locale locale, int style) { + if (locale==null) + return (DateFormat.getDateInstance(style).format(date)); + return (DateFormat.getDateInstance(style,locale).format(date)); + } + + + /** + * Convert date to String for default locale in given style. + * A null locale will return the default locale. + */ + public static String getDate(Date date, int style) { + return getDate(date,(Locale) null,style); + } + + + /** + * Convert date to String for default locale in DEFAULT style. + * A null locale will return the default locale. + */ + public static String getDate(Date date) { + return getDate(date,(Locale) null,DEFAULT); + } + + + /** + * Return String value representing Date. + * Null returns null. + * @param Date + */ + public static String toString(Date date) { + if (date==null) + return null; + else + return getDate(date); + } + + + /** + * Return String value representing Date. + * Null returns null. + * @param Date + */ + public static String toEscape(Date date) { + if (date==null) + return null; + DateFormat df = null; + try { + df = new SimpleDateFormat(ESCAPE_DATE_PATTERN); + } catch (Throwable t) { + return null; + } + df.setLenient(false); + return df.format(date); + } + + +// ---------------------------------------------------------- Timestamp + + /** + * Date separator ["-"]. + */ + public static final String DATE_SEPARATOR = "-"; + + + /** + * Time separator [":"]. + */ + public static final String TIME_SEPARATOR = ":"; + + + /** + * Date Time separator [" "]. + */ + public static final String DATE_TIME_SEPARATOR = STRING_SPACE; + + + /** + * String to prepend to time [HH:MM:SS.d] + * to create a Timestamp escape string ["0002-11-30"]. + */ + public static final String TIMESTAMP_DATE_ZERO = "0002-11-30"; + + + /** + * String to append to date [YEAR-MM-DD] + * to create a Timestamp escape string [" 00:00:00.0"]. + * Note: includes leading space. + */ + public static final String TIMESTAMP_TIME_ZERO = " 00:00:00.0"; + + + /** + * Escape string representing + * "November 30, 0002 00:00:00". + */ + public static String ZERO_TIMESTAMP_DISPLAY = "2-11-30 00:00:00"; + + + /** + * Timestamp representing ""November 30, 0002 00:00:00". + */ + public static Timestamp ZERO_TIMESTAMP = new Timestamp((long) 00000000000000); + + + + /** + * Escape string to create Timestamp representing + * "January 1, 1970 00:00:00". + */ + public static String NULL_TIMESTAMP_DISPLAY = "1970-01-01 00:00:00"; + + + /** + * @deprecated Use NULL_TIMESTAMP_DISPLAY. + */ + public static String NULL_TIMESTAMP_TEXT = "NULL_TIMESTAMP_DISPLAY"; + + + /** + * Value needed to create Timestamp representing + * "January 1, 1970 00:00:00". + * From the documentation, you would think this would be + * Timestamp(0), but empirical tests show it to be + * Timestamp(18000000). + */ + public static long NULL_TIME = (long) 18000000; + + + /** + * Timestamp representing "January 1, 1970 00:00:00". + */ + public static Timestamp NULL_TIMESTAMP = new Timestamp(NULL_TIME); + + + + /** + * Timestamp representing "December 31, 2029, 23:59:59.9" + */ + public static Timestamp MAX_TIMESTAMP = Timestamp.valueOf("2029-12-31 23:59:59.999"); + + + /** + * Return the String representing "January 1, 1970 00:00:00". + */ + public static String getTimestampDisplayNull() { + return NULL_TIMESTAMP_DISPLAY; + } + + + /** + * Return the String representing the current timestamp; + */ + public static String getTimestampDisplay() { + return getTimestamp(new Timestamp(System.currentTimeMillis())); + } + + + /** + * @deprecated Use getTimestampDisplay. + */ + public static String getTimestampText() { + return getTimestampDisplay(); + } + + + /** + * Return null if timestamp is null or equals + * "January 1, 1970 00:00:00". + */ + public static boolean isNull(Timestamp timestamp) { + return ((timestamp==null) || (timestamp.getTime()==NULL_TIME)); + } + + + /** + * Factory method to return timestamp initialized to + * current system time. + * For timestamp as a String in the default format, + * use <code>getTimestamp().toString()</code>. + */ + public static Timestamp getTimestamp() { + return new Timestamp(System.currentTimeMillis()); + } + + + /** + * Convert timestamp to String for given locale in given style. + * A null locale will return the default locale. + */ + public static String getTimestamp(Timestamp timestamp, + Locale locale, int style) { + Date date = (Date) timestamp; + if (locale==null) + return (DateFormat.getDateTimeInstance(style,style). + format(date)); + return (DateFormat.getDateTimeInstance(style,style,locale). + format(date)); + } + + + /** + * Convert date to String for default locale in given style. + * A null locale will return the default locale. + */ + public static String getTimestamp(Timestamp timestamp, + int style) { + return getTimestamp(timestamp,(Locale) null,style); + } + + + /** + * Convert date to String for default locale in DEFAULT style. + * A null locale will return the default locale. + */ + public static String getTimestamp(Timestamp timestamp) { + return getTimestamp(timestamp,(Locale) null,DEFAULT); + } + + + /** + * Return Timestamp value using a String. + * Null or conversion error returns null. + * @param String representing Timestamp + */ + public static Timestamp toTimestamp(String string) { + if (string==null) + return null; + else try { + return Timestamp.valueOf(string); + } catch (Throwable t) { + return null; + } + } + + + /** + * Return a Timestamp based on the parameters. + * Any nulls or conversion error returns null. + * @param year The year + * @param month The month + * @param day The day + * @returns Timestamp for year-month-day + */ + public static Timestamp toTimestamp(String year, String month, String day) { + + if ((null==year) || (null==month) || (null==day)) return null; + + StringBuffer sb = new StringBuffer(); + // YEAR-MM-DD 00:00:00.0 + sb.append(year); sb.append(DATE_SEPARATOR); + sb.append(month); sb.append(DATE_SEPARATOR); + sb.append(day); + + sb.append(TIMESTAMP_TIME_ZERO); + + return toTimestamp(sb.toString()); + } + + + /** + * Return String value representing Timestamp. + * Null returns null. + * @param Timestamp + */ + public static String toString(Timestamp timestamp) { + if (timestamp==null) + return null; + else + return timestamp.toString(); + } + + +// ----------------------------------------------------------- Internet + + + /** + * Return the integer value of an IP address in dotted octet form, + * like that returned by request.getRemotehost). + * :FIXME: Needs to be implemented; just returns zero. + * @param Timestamp + */ + public static Integer ipNode(String ipAddress) { + return INTEGER_ZERO; + } + + +} + 1.2 +17 -3 jakarta-commons-sandbox/scaffold/src/java/org/apache/commons/scaffold/text/Merge.java Index: Merge.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/scaffold/src/java/org/apache/commons/scaffold/text/Merge.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- Merge.java 14 Aug 2002 17:52:00 -0000 1.1 +++ Merge.java 21 Mar 2004 21:10:18 -0000 1.2 @@ -1,8 +1,22 @@ -package org.apache.commons.scaffold.text; +/* + * Copyright 2001,2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.scaffold.text; import java.util.Map; - /** * Merge utilities.
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]