001/**
002 *
003 * Copyright 2005-2008 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.commands.packet;
019
020import java.util.ArrayList;
021import java.util.List;
022
023import org.jivesoftware.smack.packet.ExtensionElement;
024import org.jivesoftware.smack.packet.IQ;
025
026import org.jivesoftware.smackx.commands.AdHocCommand;
027import org.jivesoftware.smackx.commands.AdHocCommand.Action;
028import org.jivesoftware.smackx.commands.AdHocCommand.SpecificErrorCondition;
029import org.jivesoftware.smackx.commands.AdHocCommandNote;
030import org.jivesoftware.smackx.xdata.packet.DataForm;
031
032import org.jxmpp.jid.Jid;
033
034/**
035 * Represents the state and the request of the execution of an adhoc command.
036 *
037 * @author Gabriel Guardincerri
038 */
039public class AdHocCommandData extends IQ {
040
041    public static final String ELEMENT = "command";
042    public static final String NAMESPACE = "http://jabber.org/protocol/commands";
043
044    /* JID of the command host */
045    private Jid id;
046
047    /* Command name */
048    private String name;
049
050    /* Command identifier */
051    private String node;
052
053    /* Unique ID of the execution */
054    private String sessionID;
055
056    private final List<AdHocCommandNote> notes = new ArrayList<>();
057
058    private DataForm form;
059
060    /* Action request to be executed */
061    private AdHocCommand.Action action;
062
063    /* Current execution status */
064    private AdHocCommand.Status status;
065
066    private final ArrayList<AdHocCommand.Action> actions = new ArrayList<>();
067
068    private AdHocCommand.Action executeAction;
069
070    public AdHocCommandData() {
071        super(ELEMENT, NAMESPACE);
072    }
073
074    @Override
075    protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
076        xml.attribute("node", node);
077        xml.optAttribute("sessionid", sessionID);
078        xml.optAttribute("status", status);
079        xml.optAttribute("action", action);
080        xml.rightAngleBracket();
081
082        if (getType() == Type.result) {
083            xml.halfOpenElement("actions");
084            xml.optAttribute("execute", executeAction);
085            if (actions.size() == 0) {
086                xml.closeEmptyElement();
087            } else {
088                xml.rightAngleBracket();
089
090                for (AdHocCommand.Action action : actions) {
091                    xml.emptyElement(action);
092                }
093                xml.closeElement("actions");
094            }
095        }
096
097        if (form != null) {
098            xml.append(form.toXML(null));
099        }
100
101        for (AdHocCommandNote note : notes) {
102            xml.halfOpenElement("note").attribute("type", note.getType().toString()).rightAngleBracket();
103            xml.append(note.getValue());
104            xml.closeElement("note");
105        }
106
107        // TODO ERRORS
108//        if (getError() != null) {
109//            buf.append(getError().toXML());
110//        }
111
112        return xml;
113    }
114
115    /**
116     * Returns the JID of the command host.
117     *
118     * @return the JID of the command host.
119     */
120    public Jid getId() {
121        return id;
122    }
123
124    public void setId(Jid id) {
125        this.id = id;
126    }
127
128    /**
129     * Returns the human name of the command.
130     *
131     * @return the name of the command.
132     */
133    public String getName() {
134        return name;
135    }
136
137    public void setName(String name) {
138        this.name = name;
139    }
140
141    /**
142     * Returns the identifier of the command.
143     *
144     * @return the node.
145     */
146    public String getNode() {
147        return node;
148    }
149
150    public void setNode(String node) {
151        this.node = node;
152    }
153
154    /**
155     * Returns the list of notes that the command has.
156     *
157     * @return the notes.
158     */
159    public List<AdHocCommandNote> getNotes() {
160        return notes;
161    }
162
163    public void addNote(AdHocCommandNote note) {
164        this.notes.add(note);
165    }
166
167    public void removeNote(AdHocCommandNote note) {
168        this.notes.remove(note);
169    }
170
171    /**
172     * Returns the form of the command.
173     *
174     * @return the data form associated with the command.
175     */
176    public DataForm getForm() {
177        return form;
178    }
179
180    public void setForm(DataForm form) {
181        this.form = form;
182    }
183
184    /**
185     * Returns the action to execute. The action is set only on a request.
186     *
187     * @return the action to execute.
188     */
189    public AdHocCommand.Action getAction() {
190        return action;
191    }
192
193    public void setAction(AdHocCommand.Action action) {
194        this.action = action;
195    }
196
197    /**
198     * Returns the status of the execution.
199     *
200     * @return the status.
201     */
202    public AdHocCommand.Status getStatus() {
203        return status;
204    }
205
206    public void setStatus(AdHocCommand.Status status) {
207        this.status = status;
208    }
209
210    public List<Action> getActions() {
211        return actions;
212    }
213
214    public void addAction(Action action) {
215        actions.add(action);
216    }
217
218    public void setExecuteAction(Action executeAction) {
219        this.executeAction = executeAction;
220    }
221
222    public Action getExecuteAction() {
223        return executeAction;
224    }
225
226    /**
227     * Set the 'sessionid' attribute of the command.
228     * <p>
229     * This value can be null or empty for the first command, but MUST be set for subsequent commands. See also <a
230     * href="http://xmpp.org/extensions/xep-0050.html#impl-session">XEP-0050 ยง 3.3 Session Lifetime</a>.
231     * </p>
232     *
233     * @param sessionID
234     */
235    public void setSessionID(String sessionID) {
236        this.sessionID = sessionID;
237    }
238
239    public String getSessionID() {
240        return sessionID;
241    }
242
243    public static class SpecificError implements ExtensionElement {
244
245        public static final String namespace = "http://jabber.org/protocol/commands";
246
247        public SpecificErrorCondition condition;
248
249        public SpecificError(SpecificErrorCondition condition) {
250            this.condition = condition;
251        }
252
253        @Override
254        public String getElementName() {
255            return condition.toString();
256        }
257        @Override
258        public String getNamespace() {
259            return namespace;
260        }
261
262        public SpecificErrorCondition getCondition() {
263            return condition;
264        }
265
266        @Override
267        public String toXML(String enclosingNamespace) {
268            StringBuilder buf = new StringBuilder();
269            buf.append('<').append(getElementName());
270            buf.append(" xmlns=\"").append(getNamespace()).append("\"/>");
271            return buf.toString();
272        }
273    }
274}