package is.idega.idegaweb.egov.bpm.cases.search;
import is.idega.idegaweb.egov.bpm.IWBundleStarter;
import is.idega.idegaweb.egov.bpm.cases.actionhandlers.CaseHandlerAssignmentHandler;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import com.idega.builder.bean.AdvancedProperty;
import com.idega.builder.business.AdvancedPropertyComparator;
import com.idega.jbpm.bean.BPMProcessVariable;
import com.idega.jbpm.bean.VariableInstanceInfo;
import com.idega.jbpm.identity.BPMUserFactory;
import com.idega.jbpm.variables.MultipleSelectionVariablesResolver;
import com.idega.user.business.UserBusiness;
import com.idega.user.data.User;
import com.idega.util.ArrayUtil;
import com.idega.util.CoreConstants;
import com.idega.util.ListUtil;
import com.idega.util.StringUtil;
import com.idega.util.expression.ELUtil;
@Scope("request")
@Service(MultipleSelectionVariablesResolver.BEAN_NAME_PREFIX + CaseHandlerAssignmentHandler.handlerUserIdVarName)
public class BPMCasesHandlersResolver extends MultipleSelectionVariablesResolver {
@Autowired
private BPMUserFactory userFactory;
BPMUserFactory getUserFactory() {
if (userFactory == null)
ELUtil.getInstance().autowire(this);
return userFactory;
}
@Override
public Collection<AdvancedProperty> getValues(String procDefId, String variableName) {
if (StringUtil.isEmpty(procDefId) || StringUtil.isEmpty(variableName)) {
addEmptyLabel(IWBundleStarter.IW_BUNDLE_IDENTIFIER);
return values;
}
String procDefName = getBpmDAO().getProcessDefinitionNameByProcessDefinitionId(Long.valueOf(procDefId));
if (StringUtil.isEmpty(procDefName)) {
addEmptyLabel(IWBundleStarter.IW_BUNDLE_IDENTIFIER);
return values;
}
List<Integer> ids = getUserFactory().getAllHandlersForProcess(procDefName);
if (ListUtil.isEmpty(ids)) {
addEmptyLabel(IWBundleStarter.IW_BUNDLE_IDENTIFIER);
return values;
}
values = new ArrayList<AdvancedProperty>();
for (Integer id: ids) {
values.add(new AdvancedProperty(String.valueOf(id), getUserName(id)));
}
List<AdvancedProperty> sorted = new ArrayList<AdvancedProperty>(values);
Collections.sort(sorted, new AdvancedPropertyComparator(getCurrentLocale()));
values = new ArrayList<AdvancedProperty>(sorted);
return values;
}
protected String getUserName(Integer id) {
try {
UserBusiness userBusiness = getServiceInstance(UserBusiness.class);
User user = userBusiness.getUser(Integer.valueOf(id));
return user == null ? CoreConstants.MINUS : user.getName();
} catch (Exception e) {
getLogger().log(Level.WARNING, "Error getting user by ID: " + id, e);
}
return CoreConstants.MINUS;
}
@Override
public String getIdKey() {
return null;
}
@Override
public String getValueKey() {
return null;
}
@Override
protected String getNoValuesLocalizationKey() {
return "no_handler_found";
}
@Override
protected String getNoValuesDefaultString() {
return "No handler found";
}
@Override
public String getPresentation(BPMProcessVariable variable) {
return (variable == null || variable.getValue() == null) ? CoreConstants.EMPTY : getPresentation(variable.getValue());
}
@Override
public String getPresentation(String value) {
if (StringUtil.isEmpty(value))
return null;
String[] ids = value.split(CoreConstants.SEMICOLON);
return ArrayUtil.isEmpty(ids) ? CoreConstants.MINUS : getPresentation(Arrays.asList(ids));
}
@Override
public String getPresentation(VariableInstanceInfo variable) {
return (variable == null || variable.getValue() == null) ? CoreConstants.MINUS : getPresentation(Arrays.asList(variable.getValue().toString()));
}
private String getPresentation(Collection<String> usersIds) {
if (ListUtil.isEmpty(usersIds))
return CoreConstants.MINUS;
try {
UserBusiness userBusiness = getServiceInstance(UserBusiness.class);
@SuppressWarnings("unchecked")
Collection<User> users = userBusiness.getUsers(ArrayUtil.convertListToArray(usersIds));
if (ListUtil.isEmpty(users))
return CoreConstants.MINUS;
StringBuilder presentation = new StringBuilder();
for (Iterator<User> usersIter = users.iterator(); usersIter.hasNext();) {
User user = usersIter.next();
String name = user == null ? null : user.getName();
if (StringUtil.isEmpty(name))
continue;
presentation.append(name);
if (usersIter.hasNext())
presentation.append(CoreConstants.COMMA).append(CoreConstants.SPACE);
}
String result = presentation.toString();
return StringUtil.isEmpty(result) ? CoreConstants.MINUS : result;
} catch (Exception e) {
e.printStackTrace();
}
return CoreConstants.MINUS;
}
}