/*
*  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);
        }
    }
}
