/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition 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 General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////
package org.projectforge.web.scripting;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.projectforge.scripting.ScriptDO;
import org.projectforge.scripting.ScriptParameter;
import org.projectforge.scripting.ScriptParameterType;
import org.projectforge.task.TaskDO;
import org.projectforge.task.TaskDao;
import org.projectforge.user.PFUserDO;
import org.projectforge.user.UserDao;
import org.projectforge.web.calendar.QuickSelectPanel;
import org.projectforge.web.task.TaskSelectPanel;
import org.projectforge.web.user.UserSelectPanel;
import org.projectforge.web.wicket.AbstractStandardForm;
import org.projectforge.web.wicket.WicketUtils;
import org.projectforge.web.wicket.components.DatePanel;
import org.projectforge.web.wicket.components.SingleButtonPanel;
import org.projectforge.web.wicket.flowlayout.DivPanel;
import org.projectforge.web.wicket.flowlayout.DivTextPanel;
import org.projectforge.web.wicket.flowlayout.FieldsetPanel;
import org.projectforge.web.wicket.flowlayout.InputPanel;
public class ScriptExecuteForm extends AbstractStandardForm<ScriptDO, ScriptExecutePage>
{
private static final long serialVersionUID = -8371629527384652778L;
@SpringBean(name = "taskDao")
private TaskDao taskDao;
@SpringBean(name = "userDao")
private UserDao userDao;
protected ScriptDO data;
protected List<ScriptParameter> scriptParameters;
protected DatePanel[] datePanel1 = new DatePanel[5];
protected DatePanel[] datePanel2 = new DatePanel[5];
protected FieldsetPanel parameterFieldsets[];
private DivPanel fieldSetsPanel;
protected QuickSelectPanel[] quickSelectPanel = new QuickSelectPanel[5];
protected boolean refresh;
protected RecentScriptCalls recentScriptCalls;
public ScriptExecuteForm(final ScriptExecutePage parentPage, final ScriptDO data)
{
super(parentPage);
this.data = data;
loadParameters();
}
private void loadParameters()
{
scriptParameters = new ArrayList<ScriptParameter>();
addParameter(data.getParameter1Name(), data.getParameter1Type());
addParameter(data.getParameter2Name(), data.getParameter2Type());
addParameter(data.getParameter3Name(), data.getParameter3Type());
addParameter(data.getParameter4Name(), data.getParameter4Type());
addParameter(data.getParameter5Name(), data.getParameter5Type());
addParameter(data.getParameter6Name(), data.getParameter6Type());
}
private void addParameter(final String parameterName, final ScriptParameterType type)
{
if (StringUtils.isNotBlank(parameterName) == true && type != null) {
scriptParameters.add(new ScriptParameter(parameterName, type));
}
}
private void prefillParameters()
{
final RecentScriptCalls recents = parentPage.getRecentScriptCalls();
final ScriptCallData scriptCallData = recents.getScriptCallData(data.getName());
if (scriptCallData != null && scriptCallData.getScriptParameter() != null) {
for (final ScriptParameter recentParameter : scriptCallData.getScriptParameter()) {
for (final ScriptParameter parameter : scriptParameters) {
if (StringUtils.equals(parameter.getParameterName(), recentParameter.getParameterName()) == true) {
if (parameter.getType() == recentParameter.getType()) {
// Copy only if type matches
if (parameter.getType() == ScriptParameterType.TASK) {
final TaskDO task = taskDao.getById(recentParameter.getIntValue());
parameter.setTask(task);
} else if (parameter.getType() == ScriptParameterType.USER) {
final PFUserDO user = userDao.getById(recentParameter.getIntValue());
parameter.setUser(user);
} else {
parameter.setValue(recentParameter.getValue());
}
}
break;
} // if parameterNames are equal.
} // for script parameters
} // for recent parameters.
} // if scriptCallData is given
}
@Override
@SuppressWarnings("serial")
protected void init()
{
super.init();
prefillParameters();
gridBuilder.newGridPanel();
{
final FieldsetPanel fs = gridBuilder.newFieldset(getString("scripting.script.name")).suppressLabelForWarning();
fs.add(new DivTextPanel(fs.newChildId(), data.getName()));
}
{
final FieldsetPanel fs = gridBuilder.newFieldset(getString("description")).suppressLabelForWarning();
fs.add(new DivTextPanel(fs.newChildId(), data.getDescription()));
}
{
addCancelButton(new Button(SingleButtonPanel.WICKET_ID, new Model<String>("cancel")) {
@Override
public final void onSubmit()
{
parentPage.cancel();
}
});
final Button executeButton = new Button(SingleButtonPanel.WICKET_ID, new Model<String>("execute")) {
@Override
public final void onSubmit()
{
parentPage.execute();
}
};
final SingleButtonPanel executeButtonPanel = new SingleButtonPanel(actionButtons.newChildId(), executeButton, getString("execute"),
SingleButtonPanel.DEFAULT_SUBMIT);
actionButtons.add(executeButtonPanel);
setDefaultButton(executeButton);
}
refreshParametersView();
}
@Override
public void onBeforeRender()
{
if (refresh == true) {
data = parentPage.loadScript();
loadParameters();
prefillParameters();
refreshParametersView();
refresh = false;
}
super.onBeforeRender();
}
protected void refreshParametersView()
{
if (parameterFieldsets != null) {
for (final FieldsetPanel parameterFieldset : parameterFieldsets) {
if (parameterFieldset != null) {
fieldSetsPanel.remove(parameterFieldset);
}
}
}
parameterFieldsets = new FieldsetPanel[scriptParameters.size()];
int index = 0;
boolean focusSet = false;
fieldSetsPanel = gridBuilder.getPanel();
for (final ScriptParameter parameter : scriptParameters) {
final FieldsetPanel fs = gridBuilder.newFieldset(StringUtils.capitalize(parameter.getParameterName()),
getString("scripting.script.parameter") + " " + (index + 1));
parameterFieldsets[index] = fs;
InputPanel inputPanel = null;
if (parameter.getType() == ScriptParameterType.INTEGER) {
inputPanel = fs.add(new TextField<Integer>(fs.getTextFieldId(), new PropertyModel<Integer>(parameter, "intValue")));
} else if (parameter.getType() == ScriptParameterType.STRING) {
inputPanel = fs.add(new TextField<String>(fs.getTextFieldId(), new PropertyModel<String>(parameter, "stringValue")));
} else if (parameter.getType() == ScriptParameterType.DECIMAL) {
inputPanel = fs.add(new TextField<BigDecimal>(fs.getTextFieldId(), new PropertyModel<BigDecimal>(parameter, "decimalValue")));
} else if (parameter.getType() == ScriptParameterType.DATE || parameter.getType() == ScriptParameterType.TIME_PERIOD) {
final String property = parameter.getType() == ScriptParameterType.TIME_PERIOD ? "timePeriodValue.fromDate" : "dateValue";
datePanel1[index] = new DatePanel(fs.newChildId(), new PropertyModel<Date>(parameter, property));
fs.add(datePanel1[index]);
if (parameter.getType() == ScriptParameterType.TIME_PERIOD) {
fs.add(new DivTextPanel(fs.newChildId(), " - "));
datePanel2[index] = new DatePanel(fs.newChildId(), new PropertyModel<Date>(parameter, "timePeriodValue.toDate"));
fs.add(datePanel2[index]);
quickSelectPanel[index] = new QuickSelectPanel(fs.newChildId(), parentPage, "quickSelect:" + index, datePanel1[index]);
fs.add(quickSelectPanel[index]);
quickSelectPanel[index].init();
}
} else if (parameter.getType() == ScriptParameterType.TASK) {
final TaskSelectPanel taskSelectPanel = new TaskSelectPanel(fs, new PropertyModel<TaskDO>(parameter, "task"), parentPage, "taskId:"
+ index);
fs.add(taskSelectPanel);
taskSelectPanel.init();
taskSelectPanel.setRequired(true);
} else if (parameter.getType() == ScriptParameterType.USER) {
final UserSelectPanel userSelectPanel = new UserSelectPanel(fs.newChildId(), new PropertyModel<PFUserDO>(parameter, "user"),
parentPage, "userId:" + index);
fs.add(userSelectPanel);
userSelectPanel.init();
userSelectPanel.setRequired(true);
} else {
throw new UnsupportedOperationException("Parameter type: " + parameter.getType() + " not supported.");
}
if (focusSet == false) {
if (inputPanel != null) {
WicketUtils.setFocus(inputPanel.getField());
focusSet = true;
}
}
index++;
}
refresh = false;
}
}