001/*
002 *
003 * Copyright 2003-2007 Jive Software.
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *     http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018package org.jivesoftware.smackx.workgroup.packet;
019
020import java.io.IOException;
021import java.text.ParseException;
022import java.text.SimpleDateFormat;
023import java.util.ArrayList;
024import java.util.Date;
025import java.util.List;
026import java.util.TimeZone;
027
028import org.jivesoftware.smack.packet.IqData;
029import org.jivesoftware.smack.packet.XmlEnvironment;
030import org.jivesoftware.smack.provider.IqProvider;
031import org.jivesoftware.smack.util.ParserUtils;
032import org.jivesoftware.smack.xml.XmlPullParser;
033import org.jivesoftware.smack.xml.XmlPullParserException;
034
035import org.jxmpp.JxmppContext;
036import org.jxmpp.jid.Jid;
037
038/**
039 * An IQProvider for transcripts summaries.
040 *
041 * @author Gaston Dombiak
042 */
043public class TranscriptsProvider extends IqProvider<Transcripts> {
044
045    @SuppressWarnings("DateFormatConstant")
046    private static final SimpleDateFormat UTC_FORMAT = new SimpleDateFormat("yyyyMMdd'T'HH:mm:ss");
047    static {
048        UTC_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT+0"));
049    }
050
051    @Override
052    public Transcripts parse(XmlPullParser parser, int initialDepth, IqData iqData, XmlEnvironment xmlEnvironment, JxmppContext jxmppContext)
053                    throws XmlPullParserException, IOException, TextParseException, ParseException {
054        Jid userID = ParserUtils.getJidAttribute(parser, "userID", jxmppContext);
055        List<Transcripts.TranscriptSummary> summaries = new ArrayList<>();
056
057        boolean done = false;
058        while (!done) {
059            XmlPullParser.Event eventType = parser.next();
060            if (eventType == XmlPullParser.Event.START_ELEMENT) {
061                if (parser.getName().equals("transcript")) {
062                    Transcripts.TranscriptSummary summary = parseSummary(parser);
063                    summaries.add(summary);
064                }
065            }
066            else if (eventType == XmlPullParser.Event.END_ELEMENT) {
067                if (parser.getName().equals("transcripts")) {
068                    done = true;
069                }
070            }
071        }
072
073        return new Transcripts(userID, summaries);
074    }
075
076    private static Transcripts.TranscriptSummary parseSummary(XmlPullParser parser)
077                    throws IOException, XmlPullParserException, ParseException {
078        String sessionID =  parser.getAttributeValue("", "sessionID");
079        Date joinTime = null;
080        Date leftTime = null;
081        List<Transcripts.AgentDetail> agents = new ArrayList<>();
082
083        boolean done = false;
084        while (!done) {
085            XmlPullParser.Event eventType = parser.next();
086            if (eventType == XmlPullParser.Event.START_ELEMENT) {
087                if (parser.getName().equals("joinTime")) {
088                    synchronized (UTC_FORMAT) {
089                        joinTime = UTC_FORMAT.parse(parser.nextText());
090                     }
091                }
092                else if (parser.getName().equals("leftTime")) {
093                    synchronized (UTC_FORMAT) {
094                        leftTime = UTC_FORMAT.parse(parser.nextText());
095                    }
096                }
097                else if (parser.getName().equals("agents")) {
098                    agents = parseAgents(parser);
099                }
100            }
101            else if (eventType == XmlPullParser.Event.END_ELEMENT) {
102                if (parser.getName().equals("transcript")) {
103                    done = true;
104                }
105            }
106        }
107
108        return new Transcripts.TranscriptSummary(sessionID, joinTime, leftTime, agents);
109    }
110
111    private static List<Transcripts.AgentDetail> parseAgents(XmlPullParser parser)
112                    throws IOException, XmlPullParserException, ParseException {
113        List<Transcripts.AgentDetail> agents = new ArrayList<>();
114        String agentJID =  null;
115        Date joinTime = null;
116        Date leftTime = null;
117
118        boolean done = false;
119        while (!done) {
120            XmlPullParser.Event eventType = parser.next();
121            if (eventType == XmlPullParser.Event.START_ELEMENT) {
122                if (parser.getName().equals("agentJID")) {
123                    agentJID = parser.nextText();
124                }
125                else if (parser.getName().equals("joinTime")) {
126                    synchronized (UTC_FORMAT) {
127                        joinTime = UTC_FORMAT.parse(parser.nextText());
128                    }
129                }
130                else if (parser.getName().equals("leftTime")) {
131                    synchronized (UTC_FORMAT) {
132                        leftTime = UTC_FORMAT.parse(parser.nextText());
133                    }
134                }
135                else if (parser.getName().equals("agent")) {
136                    agentJID =  null;
137                    joinTime = null;
138                    leftTime = null;
139                }
140            }
141            else if (eventType == XmlPullParser.Event.END_ELEMENT) {
142                if (parser.getName().equals("agents")) {
143                    done = true;
144                }
145                else if (parser.getName().equals("agent")) {
146                    agents.add(new Transcripts.AgentDetail(agentJID, joinTime, leftTime));
147                }
148            }
149        }
150        return agents;
151    }
152}