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}