use of au.gov.asd.tac.constellation.views.tableview.state.TableViewState in project constellation by constellation-app.
the class Table method updateColumns.
/**
* Update the columns in the table using the graph and state. This will
* clear and refresh the column index and then trigger a refresh of the
* table view, populating from the new column index.
* <p/>
* If the table's state has an element type of VERTEX then all the columns
* will be prefixed with ".source".
* <p/>
* If the element type is TRANSACTION then the attributes belonging to
* transactions will be prefixed with ".transaction". The vertex attributes
* will also be added as columns in this case. When the state's element type
* is TRANSACTION the vertex attributes will be prefixed with both ".source"
* and ".destination" so that it is distinguishable on which end of the
* transaction those values are present.
* <p/>
* Note that column references are reused where possible to ensure certain
* toolbar/menu operations to work correctly.
* <p/>
* The entire method is synchronized so it should be thread safe and keeps
* the locking logic simpler. Maybe this method could be broken out further.
*
* @param graph the graph to retrieve data from.
* @param state the current table view state.
*/
public void updateColumns(final Graph graph, final TableViewState state) {
synchronized (TABLE_LOCK) {
if (graph != null && state != null) {
if (Platform.isFxApplicationThread()) {
throw new IllegalStateException(ATTEMPT_PROCESS_JAVAFX);
}
if (SwingUtilities.isEventDispatchThread()) {
throw new IllegalStateException(ATTEMPT_PROCESS_EDT);
}
// Clear current columnIndex, but cache the column objects for reuse
final Map<String, TableColumn<ObservableList<String>, String>> columnReferenceMap = getColumnIndex().stream().collect(Collectors.toMap(column -> column.getTableColumn().getText(), column -> column.getTableColumn(), (e1, e2) -> e1));
getColumnIndex().clear();
// Update columnIndex based on graph attributes
final ReadableGraph readableGraph = graph.getReadableGraph();
try {
// Creates "source." columns from vertex attributes
getColumnIndex().addAll(createColumnIndexPart(readableGraph, GraphElementType.VERTEX, GraphRecordStoreUtilities.SOURCE, columnReferenceMap));
if (state.getElementType() == GraphElementType.TRANSACTION) {
// Creates "transaction." columns from transaction attributes
getColumnIndex().addAll(createColumnIndexPart(readableGraph, GraphElementType.TRANSACTION, GraphRecordStoreUtilities.TRANSACTION, columnReferenceMap));
// Creates "destination." columns from vertex attributes
getColumnIndex().addAll(createColumnIndexPart(readableGraph, GraphElementType.VERTEX, GraphRecordStoreUtilities.DESTINATION, columnReferenceMap));
}
} finally {
readableGraph.release();
}
// If there are no visible columns specified, write the key columns to the state
if (state.getColumnAttributes() == null) {
openColumnVisibilityMenu();
return;
}
// Sort columns in columnIndex by state, prefix and attribute name
getColumnIndex().sort(new ColumnIndexSort(state));
// Style and format columns in columnIndex
getColumnIndex().forEach(columnTuple -> {
final TableColumn<ObservableList<String>, String> column = columnTuple.getTableColumn();
// assign cells to columns
column.setCellValueFactory(cellData -> {
final int cellIndex = tableView.getColumns().indexOf(cellData.getTableColumn());
if (cellIndex < cellData.getValue().size()) {
return new SimpleStringProperty(cellData.getValue().get(cellIndex));
} else {
return null;
}
});
// Assign values and styles to cells
column.setCellFactory(cellColumn -> new TableCellFactory(cellColumn, this));
});
// calculated column changes
if (!Thread.currentThread().isInterrupted()) {
// The update columns task holds state between executions. So we need to
// reset some fields each time before it is run.
updateColumnsTask.reset(columnReferenceMap, state);
Platform.runLater(updateColumnsTask);
}
}
}
}
use of au.gov.asd.tac.constellation.views.tableview.state.TableViewState in project constellation by constellation-app.
the class TableViewStateIoProvider method readObject.
@Override
public void readObject(final int attributeId, final int elementId, final JsonNode jnode, final GraphWriteMethods graph, final Map<Integer, Integer> vertexMap, final Map<Integer, Integer> transactionMap, final GraphByteReader byteReader, final ImmutableObjectCache cache) throws IOException {
if (!jnode.isNull() && !jnode.isEmpty()) {
final boolean selectedOnly = jnode.get("selectedOnly").asBoolean();
final GraphElementType elementType = GraphElementType.valueOf(jnode.get("elementType").asText());
final List<Tuple<String, Attribute>> transactionColumnAttributes = new ArrayList<>();
if (jnode.get(TRANSACTION_COLUMN_ATTRIBUTES) != null) {
final Iterator<JsonNode> attributeIterator = jnode.get(TRANSACTION_COLUMN_ATTRIBUTES).iterator();
while (attributeIterator.hasNext()) {
final JsonNode attributeNode = attributeIterator.next();
final String attributePrefix = attributeNode.get(ATTRIBUTE_PREFIX).asText();
final Attribute attribute = new GraphAttribute(graph, graph.getAttribute(GraphElementType.valueOf(attributeNode.get(ATTRIBUTE_ELEMENT_TYPE).asText()), attributeNode.get(ATTRIBUTE_NAME).asText()));
transactionColumnAttributes.add(Tuple.create(attributePrefix, attribute));
}
}
final List<Tuple<String, Attribute>> vertexColumnAttributes = new ArrayList<>();
if (jnode.get(VERTEX_COLUMN_ATTRIBUTES) != null) {
final Iterator<JsonNode> attributeIterator = jnode.get(VERTEX_COLUMN_ATTRIBUTES).iterator();
while (attributeIterator.hasNext()) {
final JsonNode attributeNode = attributeIterator.next();
final String attributePrefix = attributeNode.get(ATTRIBUTE_PREFIX).asText();
final Attribute attribute = new GraphAttribute(graph, graph.getAttribute(GraphElementType.valueOf(attributeNode.get(ATTRIBUTE_ELEMENT_TYPE).asText()), attributeNode.get(ATTRIBUTE_NAME).asText()));
vertexColumnAttributes.add(Tuple.create(attributePrefix, attribute));
}
}
final TableViewState state = new TableViewState();
state.setSelectedOnly(selectedOnly);
state.setElementType(elementType);
state.setTransactionColumnAttributes(transactionColumnAttributes);
state.setVertexColumnAttributes(vertexColumnAttributes);
graph.setObjectValue(attributeId, elementId, state);
}
}
use of au.gov.asd.tac.constellation.views.tableview.state.TableViewState in project constellation by constellation-app.
the class TableViewTopComponentNGTest method getColumnAttributeChanges.
@Test
public void getColumnAttributeChanges() {
final TableViewTopComponent tableViewTopComponent = mock(TableViewTopComponent.class);
when(tableViewTopComponent.getRemovedAttributes(or(any(TableViewState.class), isNull()), or(any(TableViewState.class), isNull()))).thenCallRealMethod();
when(tableViewTopComponent.getAddedAttributes(or(any(TableViewState.class), isNull()), or(any(TableViewState.class), isNull()))).thenCallRealMethod();
final Attribute attribute1 = mock(Attribute.class);
final Attribute attribute2 = mock(Attribute.class);
final Attribute attribute3 = mock(Attribute.class);
final TableViewState oldState = new TableViewState();
oldState.setColumnAttributes(List.of(Tuple.create(".source", attribute1), Tuple.create(".destination", attribute2)));
final TableViewState newState = new TableViewState();
newState.setColumnAttributes(List.of(Tuple.create(".destination", attribute2), Tuple.create(".transaction", attribute3)));
// Removed column attributes
assertEquals(Set.of(Tuple.create(".source", attribute1)), tableViewTopComponent.getRemovedAttributes(oldState, newState));
assertEquals(Set.of(), tableViewTopComponent.getRemovedAttributes(null, newState));
assertEquals(Set.of(Tuple.create(".source", attribute1), Tuple.create(".destination", attribute2)), tableViewTopComponent.getRemovedAttributes(oldState, null));
// Added column attributes
assertEquals(Set.of(Tuple.create(".transaction", attribute3)), tableViewTopComponent.getAddedAttributes(oldState, newState));
assertEquals(Set.of(Tuple.create(".destination", attribute2), Tuple.create(".transaction", attribute3)), tableViewTopComponent.getAddedAttributes(null, newState));
assertEquals(Set.of(), tableViewTopComponent.getAddedAttributes(oldState, null));
}
use of au.gov.asd.tac.constellation.views.tableview.state.TableViewState in project constellation by constellation-app.
the class ActiveTableReferenceNGTest method updateVisibleColumnsAdd.
@Test
public void updateVisibleColumnsAdd() {
try (MockedStatic<PluginExecution> pluginExecutionMockedStatic = Mockito.mockStatic(PluginExecution.class)) {
final Graph graph = mock(Graph.class);
final Attribute attribute = mock(Attribute.class);
final PluginExecution pluginExecution = mock(PluginExecution.class);
final List<Tuple<String, Attribute>> paramColumnAttributes = List.of(Tuple.create("paramAttr", attribute));
final List<Tuple<String, Attribute>> stateColumnAttributes = List.of(Tuple.create("stateAttr", attribute), Tuple.create("paramAttr", attribute));
final TableViewState tableViewState = new TableViewState();
tableViewState.setColumnAttributes(stateColumnAttributes);
pluginExecutionMockedStatic.when(() -> PluginExecution.withPlugin(any(Plugin.class))).thenAnswer(executeUpdateStatePlugin(pluginExecution, tableViewState, List.of(Tuple.create("stateAttr", attribute), Tuple.create("paramAttr", attribute), Tuple.create("paramAttr", attribute))));
activeTableReference.updateVisibleColumns(graph, tableViewState, paramColumnAttributes, UpdateMethod.ADD);
verify(pluginExecution).executeLater(graph);
}
}
use of au.gov.asd.tac.constellation.views.tableview.state.TableViewState in project constellation by constellation-app.
the class ActiveTableReferenceNGTest method updateVisibleColumnsReplace.
@Test
public void updateVisibleColumnsReplace() {
try (MockedStatic<PluginExecution> pluginExecutionMockedStatic = Mockito.mockStatic(PluginExecution.class)) {
final Graph graph = mock(Graph.class);
final Attribute attribute = mock(Attribute.class);
final PluginExecution pluginExecution = mock(PluginExecution.class);
final List<Tuple<String, Attribute>> paramColumnAttributes = List.of(Tuple.create("paramAttr", attribute));
final List<Tuple<String, Attribute>> stateColumnAttributes = List.of(Tuple.create("stateAttr1", attribute), Tuple.create("stateAttr2", attribute));
final TableViewState tableViewState = new TableViewState();
tableViewState.setColumnAttributes(stateColumnAttributes);
pluginExecutionMockedStatic.when(() -> PluginExecution.withPlugin(any(Plugin.class))).thenAnswer(executeUpdateStatePlugin(pluginExecution, tableViewState, List.of(Tuple.create("paramAttr", attribute))));
activeTableReference.updateVisibleColumns(graph, tableViewState, paramColumnAttributes, UpdateMethod.REPLACE);
verify(pluginExecution).executeLater(graph);
}
}
Aggregations