001    /**
002     * Copyright 2005-2014 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.kew.messaging;
017    
018    import java.util.ArrayList;
019    import java.util.List;
020    
021    
022    /**
023     * A simple utility class which can handle translated a comma-seperated String
024     * into an array of String paramters and vice-versa.
025     *
026     * @author Kuali Rice Team (rice.collab@kuali.org)
027     */
028    public class ParameterTranslator {
029    
030            private static final String SLASH_REGEXP = "\\\\";
031        private static final String SLASH_ESCAPE = "\\\\";
032        private static final String COMMA_REGEXP = ",";
033        private static final String COMMA_ESCAPE = "\\,";
034            
035            private String untranslatedString = "";
036            
037            public ParameterTranslator() {}
038            
039            public ParameterTranslator(String untranslatedString) {
040                    this.untranslatedString = untranslatedString;
041            }
042            
043            public void addParameter(String value) {
044                    if (!org.apache.commons.lang.StringUtils.isEmpty(untranslatedString)) {
045                            untranslatedString += ",";
046                    }
047                    untranslatedString += escape(value);
048            }
049            
050            private String escape(String value) {
051                    if (org.apache.commons.lang.StringUtils.isEmpty(value)) {
052                            return "";
053                    }
054            // escape '\' and ',' with "\\" and "\,"
055            value = value.replaceAll(SLASH_REGEXP, SLASH_ESCAPE);
056            value = value.replaceAll(COMMA_REGEXP, COMMA_ESCAPE);
057            return value;
058        }
059            
060            public String getUntranslatedString() {
061                    return untranslatedString;
062            }
063            
064            public String[] getParameters() {
065                    List strings = new ArrayList();
066                    boolean isEscaped = false;
067                    StringBuffer buffer = null;
068                    for (int index = 0; index < untranslatedString.length(); index++) {
069                            char character = untranslatedString.charAt(index);
070                            if (isEscaped) {
071                                    isEscaped = false;
072                                    if (buffer == null) {
073                                            buffer = new StringBuffer();
074                                    }
075                                    buffer.append(character);
076                            } else {
077                                    if (character == '\\') {
078                                            isEscaped = true;
079                                    } else if (character == ',') {
080                                            strings.add(buffer.toString());
081                                            buffer = null;
082                                    } else {
083                                            if (buffer == null) {
084                                                    buffer = new StringBuffer();
085                                            }
086                                            buffer.append(character);
087                                    }
088                            }
089                    }
090                    // put whatever is left in the buffer (after the last ',') into the list of strings
091                    if (buffer != null) {
092                            strings.add(buffer.toString());
093                    }
094                    return (String[])strings.toArray(new String[0]);
095            }
096            
097    }