001/*
002 * Copyright (c) 2013 Nu Echo Inc. All rights reserved.
003 */
004
005package com.nuecho.rivr.voicexml.turn;
006
007import java.util.*;
008import java.util.Map.Entry;
009
010import javax.json.*;
011
012import com.nuecho.rivr.core.util.*;
013import com.nuecho.rivr.voicexml.rendering.voicexml.*;
014import com.nuecho.rivr.voicexml.util.*;
015import com.nuecho.rivr.voicexml.util.json.*;
016
017/**
018 * Collection of pairs of variable names and initial expression. The collection
019 * ensure that variable names are valid ECMAScript identifiers. The collection
020 * preserves order as it internal container is a {@link LinkedHashMap}.
021 * 
022 * @author Nu Echo Inc.
023 */
024public final class VariableList implements Iterable<Entry<String, String>>, JsonSerializable {
025
026    private static final String VARIABLE_NAME_PROPERTY = "name";
027    private static final String INITIAL_VALUE_PROPERTY = "initialValue";
028
029    private final LinkedHashMap<String, String> mVariables = new LinkedHashMap<String, String>();
030
031    public void add(String name) {
032        addWithExpression(name, null);
033    }
034
035    public void addWithExpression(String name, String initialExpression) {
036        Assert.notNull(name, "name");
037        Assert.ensure(VoiceXmlUtils.isValidIdentifierName(name), "Invalid ECMAScript identifier name: '" + name + "'");
038        mVariables.put(name, initialExpression);
039    }
040
041    public void addWithString(String name, String string) {
042        Assert.notNull(name, "name");
043        Assert.ensure(VoiceXmlUtils.isValidIdentifierName(name), "Invalid ECMAScript identifier name: '" + name + "'");
044        Assert.notNull(string, "string");
045        mVariables.put(name, VoiceXmlDomUtil.createEcmaScriptStringLiteral(string));
046    }
047
048    public void remove(String name) {
049        Assert.notNull(name, "name");
050        mVariables.remove(name);
051    }
052
053    public boolean has(String variableName) {
054        return mVariables.containsKey(variableName);
055    }
056
057    public String get(String variableName) {
058        return mVariables.get(variableName);
059    }
060
061    public boolean isEmpty() {
062        return mVariables.isEmpty();
063    }
064
065    @Override
066    public int hashCode() {
067        final int prime = 31;
068        int result = 1;
069        result = prime * result + ((mVariables == null) ? 0 : mVariables.hashCode());
070        return result;
071    }
072
073    @Override
074    public boolean equals(Object obj) {
075        if (this == obj) return true;
076        if (obj == null) return false;
077        if (getClass() != obj.getClass()) return false;
078        VariableList other = (VariableList) obj;
079        if (mVariables == null) {
080            if (other.mVariables != null) return false;
081        } else if (!mVariables.equals(other.mVariables)) return false;
082        return true;
083    }
084
085    public static VariableList create(JsonObject jsonObject) {
086        VariableList list = new VariableList();
087        for (String propertyName : jsonObject.keySet()) {
088            JsonValue jsonValue = jsonObject.get(propertyName);
089            list.addWithExpression(propertyName, jsonValue.toString());
090        }
091        return list;
092    }
093
094    @Override
095    public String toString() {
096        return asJson().toString();
097    }
098
099    @Override
100    public JsonValue asJson() {
101        JsonArrayBuilder builder = JsonUtils.createArrayBuilder();
102        for (Entry<String, String> entry : this) {
103            JsonObjectBuilder variableBuilder = JsonUtils.createObjectBuilder();
104            JsonUtils.add(variableBuilder, VARIABLE_NAME_PROPERTY, entry.getKey());
105            if (entry.getValue() != null) {
106                JsonUtils.add(variableBuilder, INITIAL_VALUE_PROPERTY, entry.getValue());
107            }
108
109            builder.add(variableBuilder);
110        }
111        return builder.build();
112    }
113
114    @Override
115    public Iterator<Entry<String, String>> iterator() {
116        return Collections.unmodifiableCollection(mVariables.entrySet()).iterator();
117    }
118}