# Expression.java

    /*
    *  Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
    *
    *  WSO2 Inc. licenses this file to you 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.synapse.commons.templates.uri.parser;

    import org.apache.synapse.commons.templates.uri.URITemplateException;

    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    import java.util.ArrayList;
    import java.util.List;

    public abstract class Expression extends Node {

        protected List<Variable> variableList = new ArrayList<Variable>(4);

        public Expression(String token) throws URITemplateException {
            super(token);
            int startIndex = 0;
            for (int i = 0; i < token.length(); i++) {
                if (token.charAt(i) == ',') {
                    if (startIndex == i) {
                        throw new URITemplateException("Illegal variable reference with zero length");
                    } else {
                        variableList.add(new Variable(token.substring(startIndex, i)));
                        startIndex = i + 1;
                    }
                } else if (i == token.length() - 1) {
                    if (startIndex < token.length()) {
                        variableList.add(new Variable(token.substring(startIndex, i + 1)));
                    }
                }
            }
        }

        @Override
        String getToken() {
            String str = "{";
            boolean first = true;
            for (Variable var : variableList) {
                if (!first) {
                    str += ",";
                } else {
                    first = false;
                }
                str += var.getName();
            }
            str += "}";
            return str;
        }

        protected String encodeValue(String value) {
            try {
                return URLEncoder.encode(value, "UTF-8").replaceAll("\\+", "%20");
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException("Error while encoding value: " + value, e);
            }
        }

        protected String decodeValue(String value) {
            try {
                return URLDecoder.decode(value.replaceAll("\\+", "%2B"), "UTF-8");
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException("Error while encoding value: " + value, e);
            }
        }
    }