001/*
002 * Copyright (c) 2013 Nu Echo Inc. All rights reserved.
003 */
004package com.nuecho.rivr.voicexml.turn.input;
005
006import static java.util.Collections.*;
007
008import java.util.*;
009
010import javax.json.*;
011
012import com.nuecho.rivr.core.channel.*;
013import com.nuecho.rivr.core.util.*;
014import com.nuecho.rivr.voicexml.servlet.*;
015import com.nuecho.rivr.voicexml.util.json.*;
016
017/**
018 * The result of an interaction with the platform, it may contains one or many
019 * of the following: a recognition result, a recording, VoiceXml events, a
020 * transfer status, a script result, uploaded files.
021 * 
022 * @author Nu Echo Inc.
023 * @see RecognitionInfo
024 * @see RecordingInfo
025 * @see TransferStatusInfo
026 * @see VoiceXmlEvent
027 * @see FileUpload
028 */
029public final class VoiceXmlInputTurn implements InputTurn, JsonSerializable {
030
031    private static final String TRANSFER_RESULT_PROPERTY = "transferResult";
032    private static final String RECORDING_INFO_PROPERTY = "recordingInfo";
033    private static final String RECOGNITION_INFO_PROPERTY = "recognitionInfo";
034    private static final String EVENTS_PROPERTY = "events";
035    private static final String VALUE_PROPERTY = "value";
036
037    private List<VoiceXmlEvent> mEvents = emptyList();
038    private JsonValue mJsonValue;
039    private RecognitionInfo mRecognitionInfo;
040    private RecordingInfo mRecordingInfo;
041    private TransferStatusInfo mTransferResult;
042    private Map<String, FileUpload> mFiles;
043
044    public List<VoiceXmlEvent> getEvents() {
045        return Collections.unmodifiableList(mEvents);
046    }
047
048    public JsonValue getJsonValue() {
049        return mJsonValue;
050    }
051
052    public RecognitionInfo getRecognitionInfo() {
053        return mRecognitionInfo;
054    }
055
056    public RecordingInfo getRecordingInfo() {
057        return mRecordingInfo;
058    }
059
060    public TransferStatusInfo getTransferResult() {
061        return mTransferResult;
062    }
063
064    public void setEvents(List<VoiceXmlEvent> events) {
065        Assert.notNull(events, "events");
066        mEvents = new ArrayList<VoiceXmlEvent>(events);
067    }
068
069    public void setJsonValue(JsonValue jsonValue) {
070        mJsonValue = jsonValue;
071    }
072
073    public void setRecognitionInfo(RecognitionInfo recognitionInfo) {
074        mRecognitionInfo = recognitionInfo;
075    }
076
077    public void setRecordingInfo(RecordingInfo recordingInfo) {
078        mRecordingInfo = recordingInfo;
079    }
080
081    public void setTransferResult(TransferStatusInfo transferResult) {
082        mTransferResult = transferResult;
083    }
084
085    public void setFiles(Map<String, FileUpload> files) {
086        mFiles = new HashMap<String, FileUpload>(files);
087    }
088
089    public Map<String, FileUpload> getFiles() {
090        return unmodifiableMap(mFiles);
091    }
092
093    @Override
094    public String toString() {
095        return asJson().toString();
096    }
097
098    @Override
099    public JsonValue asJson() {
100        JsonObjectBuilder builder = JsonUtils.createObjectBuilder();
101        JsonUtils.add(builder, VALUE_PROPERTY, mJsonValue);
102        JsonUtils.add(builder, EVENTS_PROPERTY, JsonUtils.toJson(mEvents));
103        JsonUtils.add(builder, RECOGNITION_INFO_PROPERTY, mRecognitionInfo);
104        JsonUtils.add(builder, RECORDING_INFO_PROPERTY, mRecordingInfo);
105        JsonUtils.add(builder, TRANSFER_RESULT_PROPERTY, mTransferResult);
106        return builder.build();
107    }
108
109    @Override
110    public int hashCode() {
111        final int prime = 31;
112        int result = 1;
113        result = prime * result + ((mEvents == null) ? 0 : mEvents.hashCode());
114        result = prime * result + ((mFiles == null) ? 0 : mFiles.hashCode());
115        result = prime * result + ((mJsonValue == null) ? 0 : mJsonValue.hashCode());
116        result = prime * result + ((mRecognitionInfo == null) ? 0 : mRecognitionInfo.hashCode());
117        result = prime * result + ((mRecordingInfo == null) ? 0 : mRecordingInfo.hashCode());
118        result = prime * result + ((mTransferResult == null) ? 0 : mTransferResult.hashCode());
119        return result;
120    }
121
122    @Override
123    public boolean equals(Object obj) {
124        if (this == obj) return true;
125        if (obj == null) return false;
126        if (getClass() != obj.getClass()) return false;
127        VoiceXmlInputTurn other = (VoiceXmlInputTurn) obj;
128        if (mEvents == null) {
129            if (other.mEvents != null) return false;
130        } else if (!mEvents.equals(other.mEvents)) return false;
131        if (mFiles == null) {
132            if (other.mFiles != null) return false;
133        } else if (!mFiles.equals(other.mFiles)) return false;
134        if (mJsonValue == null) {
135            if (other.mJsonValue != null) return false;
136        } else if (!mJsonValue.equals(other.mJsonValue)) return false;
137        if (mRecognitionInfo == null) {
138            if (other.mRecognitionInfo != null) return false;
139        } else if (!mRecognitionInfo.equals(other.mRecognitionInfo)) return false;
140        if (mRecordingInfo == null) {
141            if (other.mRecordingInfo != null) return false;
142        } else if (!mRecordingInfo.equals(other.mRecordingInfo)) return false;
143        if (mTransferResult == null) {
144            if (other.mTransferResult != null) return false;
145        } else if (!mTransferResult.equals(other.mTransferResult)) return false;
146        return true;
147    }
148
149}