package pl.net.bluesoft.rnd.processtool.ui.widgets.impl;
import com.vaadin.Application;
import pl.net.bluesoft.rnd.processtool.ProcessToolContext;
import pl.net.bluesoft.rnd.processtool.bpm.ProcessToolBpmSession;
import pl.net.bluesoft.rnd.processtool.model.ProcessInstance;
import pl.net.bluesoft.rnd.processtool.model.ProcessInstanceAttribute;
import pl.net.bluesoft.rnd.processtool.model.ProcessInstanceSimpleAttribute;
import pl.net.bluesoft.rnd.processtool.model.UserAttribute;
import pl.net.bluesoft.rnd.processtool.model.UserData;
import pl.net.bluesoft.rnd.processtool.model.config.ProcessStateConfiguration;
import pl.net.bluesoft.rnd.processtool.model.config.ProcessStateWidget;
import pl.net.bluesoft.rnd.processtool.model.config.ProcessStateWidgetAttribute;
import pl.net.bluesoft.rnd.processtool.ui.widgets.ProcessToolWidget;
import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.PropertyAutoWiring;
import pl.net.bluesoft.rnd.processtool.ui.widgets.event.WidgetEvent;
import pl.net.bluesoft.rnd.processtool.ui.widgets.event.WidgetEventBus;
import pl.net.bluesoft.rnd.util.i18n.I18NSource;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @author tlipski@bluesoft.net.pl
* @author amichalak@bluesoft.net.pl
*/
public abstract class BaseProcessToolWidget implements ProcessToolWidget {
protected ProcessStateConfiguration state;
protected ProcessStateWidget configuration;
protected ProcessToolWidget parent;
protected I18NSource i18NSource;
protected ProcessToolBpmSession bpmSession;
protected Set<String> permissions;
protected String generatorKey;
protected Map<String, String> attributes = new HashMap<String, String>();
protected boolean isOwner;
private Application application;
protected WidgetEventBus widgetEventBus;
@Override
public void setContext(ProcessStateConfiguration state, ProcessStateWidget configuration, I18NSource i18NSource,
ProcessToolBpmSession bpmSession, Application application, Set<String> permissions, boolean isOwner) {
this.state = state;
this.configuration = configuration;
this.i18NSource = i18NSource;
this.bpmSession = bpmSession;
this.permissions = permissions;
this.isOwner = isOwner;
this.application = application;
for (ProcessStateWidgetAttribute attr : configuration.getAttributes()) {
attributes.put(attr.getName(), attr.getValue());
}
PropertyAutoWiring.autowire(this, attributes);
}
@Override
public Application getApplication() {
return application;
}
public Map<String, String> getAttributes() {
return attributes;
}
public void setAttributes(Map<String, String> attributes) {
this.attributes = attributes;
}
@Override
public String getAttributeValue(String key) {
return attributes.get(key);
}
public UserData getLiferayUser() {
return (UserData) application.getUser();
}
public UserData getBpmUser() {
ProcessToolContext ctx = ProcessToolContext.Util.getThreadProcessToolContext();
return bpmSession.getUser(ctx);
}
public UserData getBpmUser(UserData userData) {
ProcessToolContext ctx = ProcessToolContext.Util.getThreadProcessToolContext();
return bpmSession.loadOrCreateUser(ctx, userData);
}
public Map<String, UserAttribute> getUserAttributes() {
return getBpmUser().getMainAttributesMap();
}
public Map<String, UserAttribute> getUserAttributes(UserData userData) {
return getBpmUser(userData).getMainAttributesMap();
}
public UserAttribute getUserAttribute(String key) {
return getBpmUser().findAttribute(key);
}
public UserAttribute getUserAttribute(UserData userData, String key) {
return getBpmUser(userData).findAttribute(key);
}
public void setUserAttributes(UserAttribute... attributes) {
UserData bpmUser = getBpmUser();
bpmUser.removeAllAttributes();
prepareAndSaveUserAttributes(bpmUser, attributes);
}
public void setUserAttributes(UserData userData, UserAttribute... attributes) {
UserData bpmUser = getBpmUser(userData);
bpmUser.removeAllAttributes();
prepareAndSaveUserAttributes(bpmUser, attributes);
}
public void addUserAttributes(UserAttribute... attributes) {
prepareAndSaveUserAttributes(getBpmUser(), attributes);
}
public void addUserAttributes(UserData userData, UserAttribute... attributes) {
prepareAndSaveUserAttributes(getBpmUser(userData), attributes);
}
private void prepareAndSaveUserAttributes(UserData bpmUser, UserAttribute... attributes) {
for (UserAttribute a : attributes) {
bpmUser.setAttribute(a);
}
ProcessToolContext ctx = ProcessToolContext.Util.getThreadProcessToolContext();
ctx.getUserDataDAO().saveOrUpdate(bpmUser);
}
protected boolean hasPermission(String... names) {
boolean canView = !isOwner && Arrays.asList(names).contains("VIEW");
for (String name : names) {
if (permissions.contains(name) && (isOwner || canView))
return true;
}
return permissions.contains("*");
}
public ProcessStateConfiguration getState() {
return state;
}
public void setState(ProcessStateConfiguration state) {
this.state = state;
}
@Override
public ProcessStateWidget getConfiguration() {
return configuration;
}
public void setConfiguration(ProcessStateWidget configuration) {
this.configuration = configuration;
}
public ProcessToolWidget getParent() {
return parent;
}
@Override
public void setParent(ProcessToolWidget parent) {
this.parent = parent;
}
public String getMessage(String key) {
return i18NSource.getMessage(key);
}
public Set<String> getPermissions() {
return permissions;
}
public void setPermissions(Set<String> permissions) {
this.permissions = permissions;
}
public I18NSource getI18NSource() {
return i18NSource;
}
public void setI18NSource(I18NSource i18NSource) {
this.i18NSource = i18NSource;
}
public ProcessToolBpmSession getBpmSession() {
return bpmSession;
}
public void setBpmSession(ProcessToolBpmSession bpmSession) {
this.bpmSession = bpmSession;
}
public <T extends ProcessInstanceAttribute> Collection<T> getAttributes(Class<T> cls, ProcessInstance pi) {
Collection<T> res = new HashSet<T>();
for (ProcessInstanceAttribute attr : pi.getProcessAttributes()) {
if (attr.getClass().isAssignableFrom(cls)) {
res.add((T) attr);
}
}
return res;
}
public <T extends ProcessInstanceAttribute> T getAttribute(Class<T> cls, ProcessInstance pi) {
Collection<T> collection = getAttributes(cls, pi);
if (collection.isEmpty()) {
return null;
} else {
return collection.iterator().next();
}
}
public<T extends ProcessInstanceAttribute> T getAttribute(Class<T> cls, String key, ProcessInstance pi) {
Collection<T> collection = getAttributes(cls, pi);
if (collection.isEmpty()) {
return null;
} else {
for (T t : collection) {
if (t.getKey().equals(key))
return t;
}
return null;
}
}
public String getSimpleAttribute(String key, ProcessInstance pi) {
Collection<ProcessInstanceSimpleAttribute> collection = getAttributes(ProcessInstanceSimpleAttribute.class, pi);
for (ProcessInstanceSimpleAttribute a : collection) {
if (a.getKey() != null && a.getKey().equals(key)) {
return a.getValue();
}
}
return null;
}
public void setSimpleAttribute(String key, String value, ProcessInstance pi) {
Collection<ProcessInstanceSimpleAttribute> collection = getAttributes(ProcessInstanceSimpleAttribute.class, pi);
boolean found = false;
for (ProcessInstanceSimpleAttribute a : collection) {
if (a.getKey().equals(key)) {
a.setValue(value);
found = true;
}
}
if (!found) {
ProcessInstanceSimpleAttribute processInstanceSimpleAttribute = new ProcessInstanceSimpleAttribute();
processInstanceSimpleAttribute.setValue(value);
processInstanceSimpleAttribute.setKey(key);
pi.addAttribute(processInstanceSimpleAttribute);
}
}
@Override
public boolean hasVisibleData() {
return true;
}
@Override
public void setWidgetEventBus(WidgetEventBus widgetEventBus) {
this.widgetEventBus = widgetEventBus;
}
@Override
public void handleWidgetEvent(WidgetEvent event) {
}
public String getGeneratorKey() {
return generatorKey;
}
@Override
public void setGeneratorKey(String generatorKey) {
this.generatorKey = generatorKey;
}
}