1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Revision$
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Date$
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2003-2007 Jive Software.
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License.
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *     http://www.apache.org/licenses/LICENSE-2.0
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS,
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License.
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx.workgroup.ext.macros;
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.StringReader;
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.IQ;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.provider.IQProvider;
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.util.StringUtils;
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.xmlpull.v1.XmlPullParserFactory;
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.xmlpull.v1.XmlPullParser;
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Macros iq is responsible for handling global and personal macros in the a Live Assistant
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Workgroup.
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class Macros extends IQ {
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private MacroGroup rootGroup;
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private boolean personal;
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private MacroGroup personalMacroGroup;
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public MacroGroup getRootGroup() {
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return rootGroup;
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void setRootGroup(MacroGroup rootGroup) {
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.rootGroup = rootGroup;
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public boolean isPersonal() {
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return personal;
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void setPersonal(boolean personal) {
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.personal = personal;
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public MacroGroup getPersonalMacroGroup() {
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return personalMacroGroup;
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void setPersonalMacroGroup(MacroGroup personalMacroGroup) {
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.personalMacroGroup = personalMacroGroup;
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Element name of the packet extension.
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static final String ELEMENT_NAME = "macros";
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Namespace of the packet extension.
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static final String NAMESPACE = "http://jivesoftware.com/protocol/workgroup";
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getChildElementXML() {
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        StringBuilder buf = new StringBuilder();
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        buf.append("<").append(ELEMENT_NAME).append(" xmlns=\"").append(NAMESPACE).append("\">");
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (isPersonal()) {
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            buf.append("<personal>true</personal>");
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (getPersonalMacroGroup() != null) {
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        	buf.append("<personalMacro>");
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        	buf.append(StringUtils.escapeForXML(getPersonalMacroGroup().toXML()));
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        	buf.append("</personalMacro>");
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        buf.append("</").append(ELEMENT_NAME).append("> ");
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return buf.toString();
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * An IQProvider for Macro packets.
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @author Derek DeMoro
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static class InternalProvider implements IQProvider {
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public InternalProvider() {
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            super();
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public IQ parseIQ(XmlPullParser parser) throws Exception {
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            Macros macroGroup = new Macros();
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            boolean done = false;
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            while (!done) {
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                int eventType = parser.next();
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (eventType == XmlPullParser.START_TAG) {
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    if (parser.getName().equals("model")) {
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        String macros = parser.nextText();
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        MacroGroup group = parseMacroGroups(macros);
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        macroGroup.setRootGroup(group);
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                else if (eventType == XmlPullParser.END_TAG) {
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    if (parser.getName().equals(ELEMENT_NAME)) {
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        done = true;
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return macroGroup;
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public Macro parseMacro(XmlPullParser parser) throws Exception {
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        	Macro macro = new Macro();
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        	 boolean done = false;
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            while (!done) {
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        	int eventType = parser.next();
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        	if (eventType == XmlPullParser.START_TAG) {
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		if (parser.getName().equals("title")) {
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        			parser.next();
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        			macro.setTitle(parser.getText());
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		}
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		else if (parser.getName().equals("description")) {
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        			macro.setDescription(parser.nextText());
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		}
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		else if (parser.getName().equals("response")) {
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        			macro.setResponse(parser.nextText());
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		}
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		else if (parser.getName().equals("type")) {
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        			macro.setType(Integer.valueOf(parser.nextText()).intValue());
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		}
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        	}
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	            else if (eventType == XmlPullParser.END_TAG) {
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	                if (parser.getName().equals("macro")) {
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	                    done = true;
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	                }
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	            }
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        	return macro;
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public MacroGroup parseMacroGroup(XmlPullParser parser) throws Exception {
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        	MacroGroup group = new MacroGroup();
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            boolean done = false;
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            while (!done) {
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        	int eventType = parser.next();
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        	if (eventType == XmlPullParser.START_TAG) {
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		if (parser.getName().equals("macrogroup")) {
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        			group.addMacroGroup(parseMacroGroup(parser));
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		}
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		if (parser.getName().equals("title")) {
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        			group.setTitle(parser.nextText());
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		}
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		if (parser.getName().equals("macro")) {
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        			group.addMacro(parseMacro(parser));
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        		}
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	        	}
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	            else if (eventType == XmlPullParser.END_TAG) {
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	                if (parser.getName().equals("macrogroup")) {
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	                    done = true;
175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	                }
176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	            }
177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        	return group;
179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public MacroGroup parseMacroGroups(String macros) throws Exception {
182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        	MacroGroup group = null;
184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        	XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        	parser.setInput(new StringReader(macros));
186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			int eventType = parser.getEventType();
187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			while (eventType != XmlPullParser.END_DOCUMENT) {
188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen				eventType = parser.next();
189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen				 if (eventType == XmlPullParser.START_TAG) {
190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	                    if (parser.getName().equals("macrogroup")) {
191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	                    	group = parseMacroGroup(parser);
192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	                    }
193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen				 }
194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			}
195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			return group;
196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}