/*
* Tigase Jabber/XMPP Server
* Copyright (C) 2004-2012 "Artur Hefczyc" <artur.hefczyc@tigase.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. Look for COPYING file in the top folder.
* If not, see http://www.gnu.org/licenses/.
*
* $Rev$
* Last modified by $Author$
* $Date$
*/
package tigase.server.sreceiver;
import java.util.Map;
import java.util.LinkedHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import tigase.server.Command;
import tigase.server.Packet;
import tigase.util.TigaseStringprepException;
import tigase.xml.XMLUtils;
import tigase.xmpp.BareJID;
import static tigase.server.sreceiver.PropertyConstants.*;
import static tigase.server.sreceiver.TaskCommons.*;
/**
* Describe class NewTaskCommand here.
*
*
* Created: Thu May 17 22:19:28 2007
*
* @author <a href="mailto:artur.hefczyc@tigase.org">Artur Hefczyc</a>
* @version $Rev$
*/
public class NewTaskCommand implements TaskCommandIfc {
private static Logger log =
Logger.getLogger("tigase.server.sreceiver.NewTaskCommand");
/**
* Describe <code>getNodeName</code> method here.
*
* @return a <code>String</code> value
*/
@Override
public String getNodeName() {
return "new-task";
}
/**
* Describe <code>getDescription</code> method here.
*
* @return a <code>String</code> value
*/
@Override
public String getDescription() {
return "Add new task...";
}
private boolean checkTaskName(String task_name, Packet result,
StanzaReceiver receiv) {
String msg = BareJID.parseJID(task_name)[0];
if (msg != null) {
Command.addFieldValue(result, "Info",
"Note!! " + msg + ", please provide valid task name.", "fixed");
return false;
} // end of if (msg != null)
ReceiverTaskIfc task = receiv.getTaskInstances().get(task_name);
if (task != null) {
Command.addFieldValue(result, "Info",
"Note!! Task with provided name already exists.", "fixed");
Command.addFieldValue(result, "Info",
"Please provide different task name.", "fixed");
return false;
} // end of if (task != null)
return true;
}
private void newTask_Step1(Packet result, StanzaReceiver receiv) {
Command.addFieldValue(result, "Info", "Press:", "fixed");
Command.addFieldValue(result, "Info",
"'Next' to set all parameters for the new task.", "fixed");
Command.setStatus(result, Command.Status.executing);
Command.addAction(result, Command.Action.next);
Command.addFieldValue(result, TASK_NAME_FIELD,
"", "text-single", TASK_NAME_FIELD);
String[] task_types =
receiv.getTaskTypes().keySet().toArray(new String[0]);
Command.addFieldValue(result, TASK_TYPE_FIELD, task_types[0],
TASK_TYPE_FIELD, task_types, task_types);
}
private void newTask_Step2(Packet packet, Packet result,
StanzaReceiver receiv) {
String task_type = Command.getFieldValue(packet, TASK_TYPE_FIELD);
ReceiverTaskIfc task_t =
receiv.getTaskTypes().get(task_type).getTaskType();
int start = 0;
int line_len = 60;
do {
int end = ((start + line_len < task_t.getHelp().length()) ?
start + line_len :
task_t.getHelp().length());
while (end < task_t.getHelp().length()
&& task_t.getHelp().charAt(end) != ' ') {
++end;
}
Command.addFieldValue(result, "task" + start,
task_t.getHelp().substring(start, end), "fixed");
start = end;
} while (start < task_t.getHelp().length());
Command.addFieldValue(result, "Info2",
"1. 'Finish' to create component with this parameters.", "fixed");
Command.addFieldValue(result, "Info3",
"2. 'Previous' to go back and select different component.", "fixed");
Command.setStatus(result, Command.Status.executing);
Command.addAction(result, Command.Action.complete);
Command.addAction(result, Command.Action.prev);
Map<String, PropertyItem> default_props = task_t.getDefaultParams();
PropertyItem pi = default_props.get(TASK_OWNER_PROP_KEY);
if (pi != null) {
pi.setValue(packet.getStanzaFrom().getBareJID().toString());
}
propertyItems2Command(default_props, result);
}
private void newTask_Step3(Packet packet, Packet result,
StanzaReceiver receiv) throws TigaseStringprepException {
String task_name = Command.getFieldValue(packet, TASK_NAME_FIELD);
String task_type = Command.getFieldValue(packet, TASK_TYPE_FIELD);
Map<String, PropertyItem> default_props =
receiv.getTaskTypes().get(task_type).getTaskType().getDefaultParams();
Map<String, Object> new_params = new LinkedHashMap<String, Object>();
for (String key: default_props.keySet()) {
if (default_props.get(key).isMultiValue()) {
String[] values = Command.getFieldValues(packet, XMLUtils.escape(key));
new_params.put(key, values);
} else {
String value = Command.getFieldValue(packet, XMLUtils.escape(key));
if (value == null) {
value = "";
} // end of if (value == null)
value = XMLUtils.unescape(value);
new_params.put(key, value);
}
} // end of for (String key: default_props.keySet())
receiv.addTaskInstance(task_type, task_name, new_params);
Command.addFieldValue(result, "Info",
"Created task: " + task_name, "fixed");
}
/**
* Describe <code>processCommand</code> method here.
*
* @param packet a <code>Packet</code> value
* @param result a <code>Packet</code> value
* @param receiv
* @param reciv a <code>StanzaReceiver</code> value
*/
@Override
public void processCommand(Packet packet, Packet result,
StanzaReceiver receiv) {
String task_name = Command.getFieldValue(packet, TASK_NAME_FIELD);
if (task_name == null || !checkTaskName(task_name, result, receiv)
|| (Command.getAction(packet) == Command.Action.prev)) {
Command.addFieldValue(result, STEP, "step1", "hidden");
newTask_Step1(result, receiv);
return;
} // end of if (!checkTaskName(receiv, task_name))
String task_type = Command.getFieldValue(packet, TASK_TYPE_FIELD);
TaskType tt = receiv.getTaskTypes().get(task_type);
if (tt == null) {
Command.addFieldValue(result, "Info",
"I am sorry there is a problem with instantiating task of this type: "
+ task_type, "fixed");
return;
}
if (tt.getMaxInstancesNo() <= tt.getInstancesNo()) {
Command.addFieldValue(result, "Info",
"I am sorry, maximum number of tasks instances for this type has been"
+ " exceeded: "
+ task_type, "fixed");
return;
}
if (!receiv.isAllowedCreate(packet.getStanzaFrom(), task_type)) {
Command.addFieldValue(result, "Info",
"I am sorry, you are not allowed to create task of this type: "
+ task_type, "fixed");
return;
}
Command.addFieldValue(result, TASK_NAME_FIELD, task_name, "hidden");
Command.addFieldValue(result, TASK_TYPE_FIELD, task_type, "hidden");
String step = Command.getFieldValue(packet, STEP);
if (step == null || step.equals("step1")) {
Command.addFieldValue(result, STEP, "step2", "hidden");
newTask_Step2(packet, result, receiv);
return;
} // end of if (step == null || step.equals("step1"))
try {
newTask_Step3(packet, result, receiv);
} catch (TigaseStringprepException ex) {
Logger.getLogger(NewTaskCommand.class.getName()).log(Level.SEVERE, null,
ex);
}
}
}