Hello,
I navigate through different views. One of them contains editable TreeTable (see screenshot):
serviceList = new TreeTable("Menage services for roles:");
serviceList.setTableFieldFactory(new DefaultFieldFactory(){
@Override
public Field<?> createField(Container container, final Object itemId,
final Object propertyId, Component uiContext) {
CheckBox field = new CheckBox(Objects.toString(itemId));
field.addValueChangeListener(event -> {
if (itemId instanceof ServiceDescriptor){
ServiceDescriptor service = (ServiceDescriptor) itemId;
if (field.getValue() != null && field.getValue()) {
field.addStyleName("blue");
}else{
field.removeStyleName("blue");
}
}else{//itemId instanceof ServiceGroup
for (Object service : serviceList.getContainerDataSource().getChildren(itemId)) {
serviceList.getContainerProperty(service, propertyId).setValue(event.getProperty().getValue());
}
}
});
field.addValueChangeListener(event -> {
if (systemChange){
return;
}
//some other staff
});
return field;
}
});
serviceList.addValueChangeListener(event -> {
Collection<?> value = (Collection<?>) event.getProperty().getValue();
for (Object itemId : serviceList.getItemIds()) {
if (itemId instanceof ServiceDescriptor) {
serviceList.getContainerProperty(itemId, "service").setValue(CollectionUtils.find(value, object -> {
return ((ServiceDescriptor) object).getKodSlu() == ((ServiceDescriptor) itemId).getKodSlu();
}) != null);
}
}
});
serviceList.setSizeFull();
Loading items to the tree table:
UI.getCurrent().access(() -> {
HierarchicalContainer services = (HierarchicalContainer) serviceList.getContainerDataSource();
synchronized (systemChange) {
try {
systemChange = true;
services.removeAllItems();
for (ServiceDescriptor service : loadData()) {
ServiceGroup group = service.getServiceGroup();
if (!services.containsId(group)) {
services.addItem(group);
serviceList.setCollapsed(group, false);
}
services.addItem(service);
services.setChildrenAllowed(service, false);
services.setParent(service, group);
}
} catch (Exception e1) {
error(e1);
showDBError(e1);
} finally {
systemChange = false;
}
}
});
And changing value (
roleList
is a table on the left on th screenshot):
roleList.addValueChangeListener(event -> {
if (event.getProperty().getValue() == null
|| statements.getStatement(Role_Statements.SELECT_SERVICE_BY_ROLE) == null) {
return;
}
try {
statements.getStatement(Role_Statements.SELECT_SERVICE_BY_ROLE).setValue(RoleFields.ROLE,
((EnumValueDescriptor) event.getProperty().getValue()).getValue());
ResultSet data = statements.getStatement(Role_Statements.SELECT_SERVICE_BY_ROLE).executeQuery();
Collection<ServiceDescriptor> result = new ArrayList<>();
while (data.next()) {
ServiceDescriptor service = FPSL_Statements.createServiceFromResultSet(data);
result.add(service);
}
synchronized (systemChange) {
systemChange = true;
serviceList.setValue(result);
systemChange = false;
}
} catch (Exception e) {
error(e);
showDBError(e);
};
});
Sometimes during navigation between views I get following exception:
com.vaadin.data.Buffered$SourceException
at com.vaadin.ui.AbstractField.updateValueFromDataSource(AbstractField.java:1649)
at com.vaadin.ui.AbstractField.attach(AbstractField.java:1374)
at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:590)
at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:621)
at com.vaadin.ui.AbstractField.attach(AbstractField.java:1367)
at com.vaadin.ui.AbstractSelect.attach(AbstractSelect.java:1872)
at com.vaadin.ui.Table.attach(Table.java:4248)
at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:590)
at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:621)
at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:590)
at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:621)
at com.vaadin.server.AbstractClientConnector.attach(AbstractClientConnector.java:590)
at com.vaadin.ui.AbstractComponent.attach(AbstractComponent.java:621)
[b]
at cz.pse.services.RolesView.attach(RolesView.java:99)
at com.vaadin.ui.AbstractComponent.setParent(AbstractComponent.java:528)
at com.vaadin.ui.AbstractSingleComponentContainer.setContent(AbstractSingleComponentContainer.java:149)
at com.vaadin.ui.UI.setContent(UI.java:1276)
at com.vaadin.navigator.Navigator$SingleComponentContainerViewDisplay.showView(Navigator.java:224)
at com.vaadin.navigator.Navigator.navigateTo(Navigator.java:575)
at com.vaadin.navigator.Navigator.navigateTo(Navigator.java:527)
at cz.pse.services.ServicesView$7.menuSelected(ServicesView.java:457)
[/b]
at com.vaadin.ui.MenuBar.changeVariables(MenuBar.java:191)
at com.vaadin.server.communication.ServerRpcHandler.changeVariables(ServerRpcHandler.java:486)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:305)
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:184)
at com.vaadin.server.communication.PushHandler$3.run(PushHandler.java:182)
at com.vaadin.server.communication.PushHandler.callWithUi(PushHandler.java:261)
at com.vaadin.server.communication.PushHandler.access$200(PushHandler.java:58)
at com.vaadin.server.communication.PushHandler$1.onRequest(PushHandler.java:78)
at org.atmosphere.cpr.AsynchronousProcessor.action(AsynchronousProcessor.java:205)
at org.atmosphere.cpr.AsynchronousProcessor.suspended(AsynchronousProcessor.java:104)
at org.atmosphere.container.TomcatWebSocketUtil.doService(TomcatWebSocketUtil.java:154)
at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.service(Tomcat7Servlet30SupportWithWebSocket.java:62)
at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:2075)
at org.atmosphere.websocket.DefaultWebSocketProcessor.dispatch(DefaultWebSocketProcessor.java:570)
at org.atmosphere.websocket.DefaultWebSocketProcessor$3.run(DefaultWebSocketProcessor.java:332)
at org.atmosphere.util.VoidExecutorService.execute(VoidExecutorService.java:101)
at org.atmosphere.websocket.DefaultWebSocketProcessor.dispatch(DefaultWebSocketProcessor.java:327)
at org.atmosphere.websocket.DefaultWebSocketProcessor.invokeWebSocketProtocol(DefaultWebSocketProcessor.java:424)
at org.atmosphere.websocket.DefaultWebSocketProcessor.dispatchReader(DefaultWebSocketProcessor.java:794)
at org.atmosphere.websocket.DefaultWebSocketProcessor.invokeWebSocketProtocol(DefaultWebSocketProcessor.java:526)
at org.atmosphere.container.TomcatWebSocketHandler.onTextData(TomcatWebSocketHandler.java:104)
at org.apache.catalina.websocket.StreamInbound.doOnTextData(StreamInbound.java:187)
at org.apache.catalina.websocket.StreamInbound.onData(StreamInbound.java:135)
at org.apache.coyote.http11.upgrade.UpgradeProcessor.upgradeDispatch(UpgradeProcessor.java:83)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:587)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
at com.vaadin.data.util.IndexedContainer$IndexedContainerProperty.getValue(IndexedContainer.java:901)
at com.vaadin.ui.AbstractField.getDataSourceValue(AbstractField.java:305)
at com.vaadin.ui.AbstractField.updateValueFromDataSource(AbstractField.java:1639)
... 49 more
Does anybody have an idea why the excepion is araised and how to fix it?
My vaadin version is 7.4.8.