blob: 0d294c71c05afd10f321a9771b70f6fab34ba526 [file] [log] [blame]
package org.eclipse.osbp.authentication.account.tables;
import com.github.wolfie.refresher.Refresher;
import com.vaadin.data.Container;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.server.ClientConnector;
import com.vaadin.server.Page;
import com.vaadin.server.Page.Styles;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomTable;
import com.vaadin.ui.CustomTable.Align;
import com.vaadin.ui.CustomTable.RowHeaderMode;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Notification.Type;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.UUID;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import org.eclipse.bpmn2.Task;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.extensions.EventUtils;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.di.Focus;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.osbp.authentication.account.datamarts.UserAccountDatamart;
import org.eclipse.osbp.bpm.api.BPMOperation;
import org.eclipse.osbp.bpm.api.BPMTaskEventType;
import org.eclipse.osbp.bpm.api.BPMTaskSummary;
import org.eclipse.osbp.bpm.api.BPMTaskUserEvent;
import org.eclipse.osbp.bpm.api.IBlipBPMConstants;
import org.eclipse.osbp.bpm.api.IBlipBPMFunctionProvider;
import org.eclipse.osbp.bpm.api.IBlipBPMStartInfo;
import org.eclipse.osbp.bpm.api.IBlipBPMWorkloadModifiableItem;
import org.eclipse.osbp.dsl.common.datatypes.IDto;
import org.eclipse.osbp.dsl.dto.lib.impl.DtoServiceAccess;
import org.eclipse.osbp.eventbroker.EventBrokerMsg;
import org.eclipse.osbp.osgi.hybrid.api.AbstractHybridVaaclipseView;
import org.eclipse.osbp.preferences.ProductConfiguration;
import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent;
import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherCommand;
import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherDataTag;
import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
import org.eclipse.osbp.runtime.common.filter.IDTOServiceWithMutablePersistence;
import org.eclipse.osbp.runtime.web.vaadin.common.data.IBeanSearchServiceFactory;
import org.eclipse.osbp.ui.api.contextfunction.IViewEmbeddedProvider;
import org.eclipse.osbp.ui.api.customfields.IBlobService;
import org.eclipse.osbp.ui.api.datamart.DatamartFilter;
import org.eclipse.osbp.ui.api.datamart.DatamartPrimary;
import org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator;
import org.eclipse.osbp.ui.api.datamart.IDatamartFilterGenerator.FilterChangeListener;
import org.eclipse.osbp.ui.api.e4.IE4Table;
import org.eclipse.osbp.ui.api.layout.IViewLayoutManager;
import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
import org.eclipse.osbp.ui.api.themes.IThemeResourceService.ThemeResourceType;
import org.eclipse.osbp.ui.api.user.IUser;
import org.eclipse.osbp.utils.constants.ExtendedDate;
import org.eclipse.osbp.utils.vaadin.PropertyLookup;
import org.eclipse.osbp.utils.vaadin.SelectUserWindow;
import org.eclipse.osbp.utils.vaadin.ViewLayoutManager;
import org.eclipse.osbp.vaaclipse.common.ecview.api.IECViewSessionHelper;
import org.eclipse.osbp.xtext.blip.BlipItem;
import org.eclipse.osbp.xtext.datamart.common.AEntityDatamart;
import org.eclipse.osbp.xtext.datamart.common.DatamartFilterGenerator;
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedAxis;
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedCellSet;
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedHierarchy;
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedLevel;
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedMember;
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedPosition;
import org.eclipse.osbp.xtext.datamart.common.sql.OperativeDtoContainer;
import org.eclipse.osbp.xtext.table.common.BeanFilterTable;
import org.eclipse.osbp.xtext.table.common.CellSetFilterTable;
import org.eclipse.osbp.xtext.table.common.CellSetIndexedContainer;
import org.eclipse.osbp.xtext.table.common.CellSetPagedFilterTable;
import org.eclipse.osbp.xtext.table.common.CheckboxSelectionCellSetFilterTable;
import org.eclipse.osbp.xtext.table.common.TableFilterDecorator;
import org.eclipse.osbp.xtext.table.common.TableFilterGenerator;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import org.slf4j.Logger;
import org.vaadin.hene.popupbutton.PopupButton;
@SuppressWarnings("all")
public class UserAdministrationTable extends AbstractHybridVaaclipseView implements IUser.UserLocaleListener, ClientConnector.DetachListener, ClientConnector.AttachListener, IEventDispatcher.Receiver, IE4Table, IDatamartFilterGenerator.FilterChangeListener {
private static Logger log = org.slf4j.LoggerFactory.getLogger("tables");
private boolean initDone = false;
@Inject
private IEclipseContext eclipseContext;
@Inject
private IUser user;
@Inject
private IEventDispatcher eventDispatcher;
private ArrayList<Integer> coordinateSystem;
private IViewLayoutManager layoutManager;
@Inject
private IDSLMetadataService dslMetadataService;
@Inject
private IBlobService blobService;
private UserAccountDatamart datamartInstance;
private IDatamartFilterGenerator filterGenerator;
private Refresher tableSelectDelay;
private Refresher tableRefresher;
private Component dataComponent;
private HashMap<String, PropertyLookup> attributeLookupMap;
private HashMap<Component, ArrayList<String>> tabSheets;
private CellSetIndexedContainer dataSourceContainer;
private OperativeDtoContainer operativeDtoContainer;
private ArrayList<CellSetFilterTable> tables;
@Inject
private IEventBroker eventBroker;
@Inject
private IPresentationEngine renderingEngine;
@Inject
private IThemeResourceService themeResourceService;
private EventHandler delegatedTask;
private EventHandler dispatchAction;
private TableFilterDecorator tableFilterDecorator;
@Inject
public UserAdministrationTable(final VerticalLayout parent, final IEclipseContext context, final MApplication app) {
super(parent,context,app);
}
public ArrayList<Integer> getCoordinateSystem() {
return this.coordinateSystem;
}
public DerivedCellSet getCellSet() {
operativeDtoContainer = null;
DerivedCellSet cellSet = datamartInstance.getResults(getTaskOperativeDtoClass(), getTaskInitialOperativeDtos());
if (cellSet != null) {
operativeDtoContainer = cellSet.getOperativeDtoContainer();
}
return cellSet;
}
@Focus
public void setFocus() {
if(!tables.isEmpty()) {
tables.get(0).focus();
}
}
@Override
public void attach(final ClientConnector.AttachEvent event) {
user.addUserLocaleListener(this);
eventDispatcher.addEventReceiver(this);
filterGenerator.addFilterChangeListener(this);
}
@Override
public void detach(final ClientConnector.DetachEvent event) {
user.removeUserLocaleListener(this);
eventDispatcher.removeEventReceiver(this);
filterGenerator.removeFilterChangeListener(this);
}
public void createView(final VerticalLayout parent) {
getContext().set(IE4Table.class, this);
tables = new ArrayList<CellSetFilterTable>();
tableFilterDecorator = new TableFilterDecorator(dslMetadataService, user.getLocale());
// the timeout to begin the filter process after the last key pressed
tableFilterDecorator.setTextChangeTimeout(500);
parent.setPrimaryStyleName("osbp");
parent.setId("parent");
parent.setSizeFull();
parent.addAttachListener(this);
parent.addDetachListener(this);
layoutManager = new ViewLayoutManager();
layoutManager.init(parent);
datamartInstance = new UserAccountDatamart();
datamartInstance.setUser(user);
filterGenerator = new DatamartFilterGenerator(datamartInstance, dslMetadataService);
filterGenerator.createUIFilters(layoutManager);
coordinateSystem = new ArrayList<Integer>();
tableSelectDelay = new Refresher();
tableRefresher = new Refresher();
attributeLookupMap = new HashMap<>();
tabSheets = new HashMap<>();
setup();
initDone = true;
}
public void createComponents() {
// get the results
final DerivedCellSet cellSet = getCellSet();
if (cellSet == null) {
promptSecurityMessage(dslMetadataService.translate(user.getLocale().toLanguageTag(), "securityMessage"), layoutManager.getDataArea());
return;
} else {
layoutManager.getDataArea().removeAllComponents();
}
getCoordinateSystem().clear();
// generate a new result component
if (cellSet != null) {
// create a multidimensional coordinate system against the cellSet
for (int axis = 0; axis < cellSet.getAxes().size(); axis++) {
getCoordinateSystem().add(0);
}
// remove any previous component
if (dataComponent != null) {
layoutManager.getDataArea().removeComponent(dataComponent);
dataComponent = null;
}
if (cellSet.getAxes().size() < 2) {
log.error("at least 2 axes from referenced datamart UserAccount are needed to render UserAdministration");
} else {
dataComponent = createTabSheet(cellSet, cellSet.getAxes().size());
if (dataComponent != null) {
dataComponent.setSizeFull();
dataComponent.setId("dataComponent");
layoutManager.getDataArea().addComponent(dataComponent);
layoutManager.getDataArea().setExpandRatio(dataComponent, 1);
}
}
}
else {
log.error("referenced datamart UserAccount generates no results");
}
}
public Component createTabSheet(final DerivedCellSet cellSet, final Integer axisNo) {
tables.clear();
// either create a recursive tabsheet or a table
Component component = null;
if (axisNo == 2) {
component = createTable(cellSet);
}
else {
Integer axis = axisNo-1;
TabSheet tabsheet = new TabSheet();
tabsheet.setSizeFull();
tabSheets.put(tabsheet, new ArrayList<String>());
DerivedAxis tabAxis = cellSet.getAxes().get(axis);
// create a tab page for all tab axis members
int tabNo = 0;
for (DerivedPosition column : tabAxis.getPositions()) {
// create the title for the axis
for (DerivedMember member : column.getMembers()) {
tabSheets.get(tabsheet).add(member.getCaption());
}
// position the data to this coordinate
getCoordinateSystem().set(axis, tabNo);
component = createTabSheet(cellSet, axis);
// set the caption
if (component != null) {
component.setCaption("");
tabsheet.addComponent(component);
if (component instanceof CellSetFilterTable) {
tabsheet.addComponent(((CellSetFilterTable)component));
}
}
tabNo++;
}
component = tabsheet;
}
return component;
}
public Component createTable(final DerivedCellSet cellSet) {
final CellSetFilterTable table = new CellSetFilterTable();
VerticalLayout tableLayout = new VerticalLayout();
table.setImmediate(true);
table.setMultiSelect(false);
table.setColumnCollapsingAllowed(true);
table.setColumnReorderingAllowed(true);
table.setId("table");
table.setRowHeaderMode(RowHeaderMode.HIDDEN);
table.setFilterDecorator(tableFilterDecorator);
table.setFilterBarVisible(true);
table.setSelectable(true);
table.setSizeFull();
tableLayout.addComponent(table);
tables.add(table);
// add attributeLookups for column and row attribute supplements
attributeLookupMap.put("__USERACCOUNT__ID__", new PropertyLookup(themeResourceService, dslMetadataService, blobService, user.getLocale())
.setCollapseColumn(true)
);
attributeLookupMap.put("PROFILEIMAGE", new PropertyLookup(themeResourceService, dslMetadataService, blobService, user.getLocale())
.setBlob(true, 2)
);
dataSourceContainer = new CellSetIndexedContainer(dslMetadataService, user.getLocale(), themeResourceService, blobService, attributeLookupMap, cellSet, coordinateSystem, false);
table.setContainerDataSource(dataSourceContainer);
dataSourceContainer.addExtras(table);
table.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) {
Object msg = null;
Object id = null;
String target = null;
Object value = table.getValue();
int selection = -1;
if (value instanceof Integer) {
selection = (Integer)value;
}
else {
if ((value instanceof Collection<?>) && (((Collection<?>)value).size() == 1)) {
value = ((Collection<?>)value).iterator().next();
if (value instanceof Integer) {
selection = (Integer)value;
}
}
}
EventDispatcherEvent evnt = new EventDispatcherEvent(EventDispatcherCommand.SELECT, "org.eclipse.osbp.authentication.account.entities.UserAccount.id", "org.eclipse.osbp.authentication.account.tables.UserAdministration");
evnt.addItem(EventDispatcherDataTag.ID, dataSourceContainer.getValueByProperty(selection, "__useraccount__id__"));
eventDispatcher.sendEvent(evnt);
}
});
return tableLayout;
}
public void dataRefresh() {
try {
// if no current ui found
if (UI.getCurrent() == null) {
for(CellSetFilterTable table:tables) {
UI.setCurrent(table.getUI());
break;
}
}
if(dataSourceContainer== null || !dataSourceContainer.updateContainer(getCellSet())) {
log.debug("cannot update container - full refresh");
renderData();
}
for(CellSetFilterTable table:tables) {
table.sanitizeSelection();
}
} catch (Exception e) {
log.error("dataRefresh", e);
}
}
protected void setup() {
subscribe();
}
protected void subscribe() {
}
@PreDestroy
protected void unsubscribe() {
}
@Override
public void localeChanged(final Locale locale) {
if(initDone) {
tableFilterDecorator.setLocale(locale);
for(CellSetFilterTable table:tables) {
table.setLocale(locale);
}
for(String key:attributeLookupMap.keySet()) {
attributeLookupMap.get(key).setLocale(locale);
}
for(Component tabSheet : tabSheets.keySet()) {
((TabSheet)tabSheet).setCaption(tabSheets.get(tabSheet).stream().map(x->dslMetadataService.translate(locale.toLanguageTag(), x)).collect(Collectors.joining("/")));
}
if(dataSourceContainer != null) {
dataSourceContainer.setLocale(locale);
}
layoutManager.setLabelValue(dslMetadataService.translate(locale.toLanguageTag(), "UserAdministration"));
}
}
@Override
public void receiveEvent(final EventDispatcherEvent event) {
switch(event.getCommand()) {
case SELECT:
if(!event.getSender().equals("org.eclipse.osbp.authentication.account.tables.UserAdministration")) {
if(filterGenerator.selectItem(event, false)) {
renderData();
}
}
break;
case SAVE:
case DELETE:
if(!event.getSender().equals("org.eclipse.osbp.authentication.account.tables.UserAdministration")) {
if(event.getTopic().equals("org.eclipse.osbp.authentication.account.entities.UserAccount")){
datamartInstance.clearCache();
List<DatamartPrimary<?>> primaryKeys = datamartInstance.getPrimaryList();
for(DatamartPrimary key : primaryKeys) {
if(key.contains(event.getData().get(EventDispatcherDataTag.ID))) {
dataRefresh();
}
}
}
}
break;
case REFRESH:
if(!event.getSender().equals("org.eclipse.osbp.authentication.account.tables.UserAdministration")) {
if(event.getTopic().equals("org.eclipse.osbp.authentication.account.entities.UserAccount")){
datamartInstance.clearCache();
dataRefresh();
}
}
break;
}
}
@Override
public void filterChanged(final DatamartFilter changedFilter) {
if(changedFilter != null) {
EventDispatcherEvent evnt = new EventDispatcherEvent(EventDispatcherCommand.SELECT, changedFilter.getName(), "org.eclipse.osbp.authentication.account.tables.UserAdministration");
evnt.addData(changedFilter.getSelectedData());
eventDispatcher.sendEvent(evnt);
}
dataRefresh();
}
}