001/**
002 * Copyright 2005-2016 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 */
016package org.kuali.rice.kew.messaging;
017
018import java.util.ArrayList;
019import 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 */
028public 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}