package pl.net.bluesoft.rnd.pt.ext.userdata.widget;
import com.vaadin.data.Property;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.ui.AbstractSelect;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.VerticalLayout;
import pl.net.bluesoft.rnd.processtool.model.BpmTask;
import pl.net.bluesoft.rnd.processtool.model.ProcessInstance;
import pl.net.bluesoft.rnd.processtool.ui.widgets.ProcessToolDataWidget;
import pl.net.bluesoft.rnd.processtool.ui.widgets.ProcessToolVaadinWidget;
import pl.net.bluesoft.rnd.processtool.ui.widgets.ProcessToolWidget;
import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AperteDoc;
import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AutoWiredProperty;
import pl.net.bluesoft.rnd.processtool.ui.widgets.impl.BaseProcessToolVaadinWidget;
import pl.net.bluesoft.rnd.pt.ext.userdata.model.ProcessInstanceUserAssignment;
import java.util.Collection;
import java.util.HashSet;
import static pl.net.bluesoft.util.lang.FormatUtil.nvl;
/**
* @author tlipski@bluesoft.net.pl
*/
public abstract class UserDataWidget
extends BaseProcessToolVaadinWidget
implements ProcessToolDataWidget, ProcessToolVaadinWidget, Property.ValueChangeListener {
UserData selectedUser = null;
private ComboBox combo;
private Collection<UserData> users;
@AutoWiredProperty
@AperteDoc(
humanNameKey = "userdata.widget.bpmVariableName",
descriptionKey = "userdata.widget.bpmVariableName.description"
)
private String bpmVariableName;
@AutoWiredProperty(required = true)
@AperteDoc(
humanNameKey = "userdata.widget.roleInProcess",
descriptionKey = "userdata.widget.roleInProcess.description"
)
private String roleInProcess;
@AutoWiredProperty
@AperteDoc(
humanNameKey = "userdata.widget.required",
descriptionKey = "userdata.widget.required.description"
)
private Boolean required;
@Override
public Collection<String> validateData(BpmTask task, boolean skipRequired) {
Collection<String> res = new HashSet<String>();
if (getRequired() && selectedUser==null) {
res.add("ext.userdata.validate.required."+ roleInProcess);
}
return res;
}
@Override
public void saveData(BpmTask task) {
boolean found = false;
ProcessInstance pi = task.getProcessInstance();
for (ProcessInstanceUserAssignment assign : getAttributes(ProcessInstanceUserAssignment.class, pi)) {
if ((roleInProcess == null && assign.getRole() == null) || (assign.getRole() != null && assign.getRole().equals(roleInProcess))) {
found = true;
if (selectedUser == null) {
pi.removeAttribute(assign);
} else {
assign.setBpmLogin(selectedUser.getBpmLogin());
assign.setUserLogin(selectedUser.getLogin());
assign.setUserDescription(selectedUser.getDescription());
}
}
}
if (!found && selectedUser != null) {
ProcessInstanceUserAssignment assign = new ProcessInstanceUserAssignment();
assign.setUserLogin(selectedUser.getLogin());
assign.setUserDescription(selectedUser.getDescription());
assign.setBpmLogin(selectedUser.getBpmLogin());
assign.setRole(roleInProcess);
assign.setKey(roleInProcess);
pi.addAttribute(assign);
}
}
@Override
public void loadData(BpmTask task) {
ProcessInstance processInstance = task.getProcessInstance();
for (ProcessInstanceUserAssignment assign : getAttributes(ProcessInstanceUserAssignment.class, processInstance)) {
if ((roleInProcess == null && assign.getRole() == null) || (assign.getRole() != null && assign.getRole().equals(roleInProcess))) {
selectedUser = new UserData();
selectedUser.setLogin(assign.getUserLogin());
selectedUser.setDescription(assign.getUserDescription());
break;
}
}
if (selectedUser != null && combo != null) {
for (UserData ud : users) {
if (selectedUser.getLogin().equals(ud.getLogin())) {
combo.setValue(ud);
}
}
}
}
@Override
public Component render() {
combo = new ComboBox(i18NSource.getMessage("ext.userdata.prompt." + roleInProcess));
combo.setItemCaptionPropertyId("description");
combo.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY);
combo.setFilteringMode(AbstractSelect.Filtering.FILTERINGMODE_CONTAINS);
combo.setImmediate(true);
combo.addListener(this);
combo.setNewItemsAllowed(false);
if (getRequired()) {
combo.setRequired(true);
combo.setDescription(i18NSource.getMessage("ext.userdata.validate.required."+ roleInProcess));
}
users = getUsers();
BeanItemContainer bic = new BeanItemContainer(users);
combo.setContainerDataSource(bic);
bic.sort(new Object[] { "description" }, new boolean[] { true });
if (selectedUser != null) {
for (UserData ud : users) {
if (selectedUser.getLogin().equals(ud.getLogin())) {
combo.setValue(ud);
}
}
}
VerticalLayout vl = new VerticalLayout();
vl.addComponent(combo);
combo.setReadOnly(!hasPermission("EDIT"));
vl.setWidth("100%");
combo.setWidth("100%");
return vl;
}
public void valueChange(Property.ValueChangeEvent event) {
selectedUser = (UserData) combo.getValue();
}
protected abstract Collection<UserData> getUsers();
@Override
public void addChild(ProcessToolWidget child) {
throw new IllegalArgumentException("Not supported!");
}
public String getBpmVariableName() {
return bpmVariableName;
}
public void setBpmVariableName(String bpmVariableName) {
this.bpmVariableName = bpmVariableName;
}
public String getRoleInProcess() {
return roleInProcess;
}
public void setRoleInProcess(String roleInProcess) {
this.roleInProcess = roleInProcess;
}
public Boolean getRequired() {
return nvl(required, false);
}
public void setRequired(Boolean required) {
this.required = required;
}
}