diff --git a/src/main/java/com/silverboxsoft/dynamodbtool/classes/DynamoDbResult.java b/src/main/java/com/silverboxsoft/dynamodbtool/classes/DynamoDbResult.java index 92637e5..9b3e91b 100644 --- a/src/main/java/com/silverboxsoft/dynamodbtool/classes/DynamoDbResult.java +++ b/src/main/java/com/silverboxsoft/dynamodbtool/classes/DynamoDbResult.java @@ -18,7 +18,7 @@ public class DynamoDbResult { private List columnList = new ArrayList<>(); private Map colNameIndex = new HashMap<>(); - private List> resItems = new ArrayList<>(); + private List resItems = new ArrayList<>(); private List> rawResItems = new ArrayList<>(); public DynamoDbResult(List> items, TableDescription tableInfo) { @@ -35,14 +35,11 @@ private void prepareKeyInfo(TableDescription tableInfo) { private void initilize(List> items) { for (Map resItem : items) { - this.rawResItems.add(resItem); - - ObservableList record = getOneTableRecord(resItem); - this.resItems.add(record); + addRecord(resItem); } } - public ObservableList getOneTableRecord(Map resItem) { + public ObservableList prepareOneTableRecord(Map resItem) { ObservableList record = FXCollections.observableArrayList(); // pick up data which attribute name is set. @@ -69,7 +66,7 @@ public ObservableList getOneTableRecord(Map resI } private void fillNewColumn() { - this.resItems.stream().forEach(rec -> rec.add(DynamoDbUtils.NO_VALSTR)); + this.resItems.stream().forEach(rec -> rec.getData().add(DynamoDbUtils.NO_VALSTR)); } public int getColumnCount() { @@ -80,7 +77,7 @@ public int getRecordCount() { return resItems.size(); } - public List> getResultItems() { + public List getResultItems() { return resItems; } @@ -92,15 +89,33 @@ public DynamoDbColumn getDynamoDbColumn(int index) { return columnList.get(index); } - public void addRecord(Map newRec) { - rawResItems.add(newRec); + public DynamoDbViewRecord addRecord(Map newRec) { + this.rawResItems.add(newRec); + + ObservableList data = prepareOneTableRecord(newRec); + DynamoDbViewRecord record = DynamoDbViewRecord.builder().index(this.resItems.size()).data(data) + .build(); + this.resItems.add(record); + return record; } - public void updateRecord(int rowIndex, Map newRec) { + public DynamoDbViewRecord updateRecord(int rowIndex, Map newRec) { rawResItems.set(rowIndex, newRec); + ObservableList data = prepareOneTableRecord(newRec); + DynamoDbViewRecord record = resItems.get(rowIndex); + record.setData(data); + resItems.set(rowIndex, record); + return record; } public void removeRecord(int rowIndex) { rawResItems.remove(rowIndex); } + + public Integer getColumnIndexByName(String colName) { + if (colNameIndex.containsKey(colName)) { + return colNameIndex.get(colName); + } + return -1; + } } diff --git a/src/main/java/com/silverboxsoft/dynamodbtool/classes/DynamoDbViewRecord.java b/src/main/java/com/silverboxsoft/dynamodbtool/classes/DynamoDbViewRecord.java new file mode 100644 index 0000000..f7dddc8 --- /dev/null +++ b/src/main/java/com/silverboxsoft/dynamodbtool/classes/DynamoDbViewRecord.java @@ -0,0 +1,13 @@ +package com.silverboxsoft.dynamodbtool.classes; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import lombok.Data; +import lombok.experimental.Builder; + +@Data +@Builder +public class DynamoDbViewRecord { + int index; + ObservableList data = FXCollections.observableArrayList(); +} diff --git a/src/main/java/com/silverboxsoft/dynamodbtool/controller/DynamoDbTable.java b/src/main/java/com/silverboxsoft/dynamodbtool/controller/DynamoDbTable.java index 76f4c54..4cca6c1 100644 --- a/src/main/java/com/silverboxsoft/dynamodbtool/controller/DynamoDbTable.java +++ b/src/main/java/com/silverboxsoft/dynamodbtool/controller/DynamoDbTable.java @@ -18,6 +18,7 @@ import com.silverboxsoft.dynamodbtool.classes.DynamoDbConnectInfo; import com.silverboxsoft.dynamodbtool.classes.DynamoDbErrorInfo; import com.silverboxsoft.dynamodbtool.classes.DynamoDbResult; +import com.silverboxsoft.dynamodbtool.classes.DynamoDbViewRecord; import com.silverboxsoft.dynamodbtool.controller.inputdialog.DynamoDbRecordInputDialog; import com.silverboxsoft.dynamodbtool.dao.DeleteItemDao; import com.silverboxsoft.dynamodbtool.dao.PartiQLDao; @@ -95,7 +96,7 @@ public class DynamoDbTable extends AnchorPane { * data area */ @FXML - TableView> tableResultList; + TableView tableResultList; @FXML ContextMenu contextMenuTable; @@ -219,62 +220,31 @@ public void actAdd(ActionEvent ev) throws Exception { } public void actCopyAdd(ActionEvent ev) throws Exception { - int row = getCurrentRow(); - if (row < 0) { + int dataIndex = getCurrentDataIndex(); + if (dataIndex < 0) { return; } - Map rec = dynamoDbResult.getRawResItems().get(row); + Map rec = dynamoDbResult.getRawResItems().get(dataIndex); doAdd(rec); } public void actUpdate(ActionEvent ev) throws URISyntaxException { - int row = getCurrentRow(); - if (row < 0) { + int dataIndex = getCurrentDataIndex(); + if (dataIndex < 0) { return; } - Map rec = dynamoDbResult.getRawResItems().get(row); - DynamoDbRecordInputDialog dialog = new DynamoDbRecordInputDialog(currentTableInfo, rec, DynamoDbEditMode.UPD); - Optional> newRecWk = dialog.showAndWait(); - if (newRecWk.isPresent()) { - Map newRec = newRecWk.get(); - PutItemDao dao = new PutItemDao(connInfo); - dao.putItem(currentTableInfo, newRec); - - dynamoDbResult.updateRecord(row, newRec); - ObservableList tableRec = dynamoDbResult.getOneTableRecord(newRec); - tableResultList.getItems().set(row, tableRec); - } + Map rec = dynamoDbResult.getRawResItems().get(dataIndex); + doUpdate(dataIndex, rec); } public void actDel(ActionEvent ev) throws Exception { - int row = getCurrentRow(); - if (row < 0) { + int dataIndex = getCurrentDataIndex(); + if (dataIndex < 0) { return; } - Map rec = dynamoDbResult.getRawResItems().get(row); + Map rec = dynamoDbResult.getRawResItems().get(dataIndex); - StringBuilder sb = new StringBuilder(); - sb.append("Table name = ").append(currentTableInfo.tableName()).append("\r\n"); - sb.append("Partition key ").append(getPartitionKeyName()).append(" = ") // - .append(rec.get(partitionKeyName).toString()).append("\r\n"); - if (hasSortKey) { - sb.append("Sort key ").append(getSortKeyName()) // - .append(" = ").append(rec.get(sortKeyName).toString()).append("\r\n"); - } - - Alert confirmDialog = new Alert(AlertType.CONFIRMATION); - confirmDialog.setHeaderText("Delete Information"); - // confirmDialog.getDialogPane().getButtonTypes().add(ButtonType.OK); - // confirmDialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL); - confirmDialog.setContentText(sb.toString()); - ButtonType retType = confirmDialog.showAndWait().get(); - if (retType == ButtonType.OK) { - DeleteItemDao dao = new DeleteItemDao(connInfo); - dao.deleteItem(currentTableInfo, rec); - - dynamoDbResult.removeRecord(row); - tableResultList.getItems().remove(row); - } + doDelete(dataIndex, rec); } public TableDescription getTableInfo() { @@ -375,7 +345,7 @@ private void setCurrentTableInfo() throws URISyntaxException { private void copyToClipBoardSub(CopyModeType type) { final ClipboardContent content = new ClipboardContent(); - TableViewSelectionModel> selectedModel = tableResultList.getSelectionModel(); + TableViewSelectionModel selectedModel = tableResultList.getSelectionModel(); if (selectedModel.getSelectedItems().size() == 0) { return; } @@ -391,19 +361,21 @@ private void copyToClipBoardSub(CopyModeType type) { } } - private String getWholeTableSelectedCellString(TableViewSelectionModel> selectedModel, + private String getWholeTableSelectedCellString(TableViewSelectionModel selectedModel, CopyModeType type) { List> posList = getPositionList(selectedModel); StringBuilder selectedRowStrSb = new StringBuilder(); int oldRow = posList.get(0).getValue(); for (Pair position : posList) { - int newCol = position.getKey(); - int newRow = position.getValue(); - String colName = dynamoDbResult.getDynamoDbColumn(newCol).getColumnName(); - String wkCellStr = tableResultList.getItems().get(newRow).get(position.getKey()); + int wkCol = position.getKey(); + int wkRow = position.getValue(); + + String colName = tableResultList.getColumns().get(wkCol).getId(); + int wkColIdx = dynamoDbResult.getColumnIndexByName(colName); + String wkCellStr = tableResultList.getItems().get(wkRow).getData().get(wkColIdx); String cellStr = escapedItemStr(colName, wkCellStr, type); - if (oldRow != newRow) { + if (oldRow != wkRow) { selectedRowStrSb.append(lineWrapStr(type, false)); selectedRowStrSb.append(lineSepStr(type)); selectedRowStrSb.append(lineWrapStr(type, true)); @@ -424,9 +396,9 @@ private String getWholeTableSelectedCellString(TableViewSelectionModel> selectedModel, + private String getWholeTableSelectedRowString(TableViewSelectionModel selectedModel, CopyModeType type) { - ObservableList> selectedRecords = selectedModel.getSelectedItems(); + ObservableList selectedRecords = selectedModel.getSelectedItems(); if (selectedRecords.size() == 0) { return null; } @@ -444,7 +416,7 @@ private String getWholeTableSelectedRowString(TableViewSelectionModel record : selectedRecords) { + for (DynamoDbViewRecord record : selectedRecords) { if (selectedRowStrSb.length() > 0) { selectedRowStrSb.append(lineSepStr(type)); } @@ -455,11 +427,11 @@ private String getWholeTableSelectedRowString(TableViewSelectionModel colNameList, ObservableList record, CopyModeType type) { + private String getOneRowString(List colNameList, DynamoDbViewRecord record, CopyModeType type) { StringBuilder oneRowStrSb = new StringBuilder(); - for (int colIdx = 0; colIdx < record.size(); colIdx++) { - String item = record.get(colIdx); - String wkItemStr = item == null ? "" : record.get(colIdx); + for (int colIdx = 0; colIdx < record.getData().size(); colIdx++) { + String item = record.getData().get(colIdx); + String wkItemStr = item == null ? "" : record.getData().get(colIdx); if (oneRowStrSb.length() > 0) { oneRowStrSb.append(itemSepStr(type)); } @@ -528,13 +500,13 @@ private String escapedItemStr(String colName, String orgStr, CopyModeType type) return retStrSb.toString(); } - private int getCurrentRow() { - TableViewSelectionModel> selectedModel = tableResultList.getSelectionModel(); - List> posList = getPositionList(selectedModel); - if (posList.size() == 0) { + private int getCurrentDataIndex() { + TableViewSelectionModel selectedModel = tableResultList.getSelectionModel(); + DynamoDbViewRecord selRec = selectedModel.getSelectedItem(); + if (selRec == null) { return -1; } - return posList.get(0).getValue(); + return selRec.getIndex(); } private void doAdd(Map rec) throws URISyntaxException { @@ -545,20 +517,57 @@ private void doAdd(Map rec) throws URISyntaxException { PutItemDao dao = new PutItemDao(connInfo); dao.putItem(currentTableInfo, newRec); - dynamoDbResult.addRecord(newRec); - ObservableList tableRec = dynamoDbResult.getOneTableRecord(newRec); - tableResultList.getItems().add(tableRec); + DynamoDbViewRecord viewRec = dynamoDbResult.addRecord(newRec); + tableResultList.getItems().add(viewRec); + } + } + + private void doUpdate(int dataIndex, Map rec) throws URISyntaxException { + DynamoDbRecordInputDialog dialog = new DynamoDbRecordInputDialog(currentTableInfo, rec, DynamoDbEditMode.UPD); + Optional> newRecWk = dialog.showAndWait(); + if (newRecWk.isPresent()) { + Map newRec = newRecWk.get(); + PutItemDao dao = new PutItemDao(connInfo); + dao.putItem(currentTableInfo, newRec); + + DynamoDbViewRecord tableRec = dynamoDbResult.updateRecord(dataIndex, newRec); + tableResultList.getItems().set(dataIndex, tableRec); + } + } + + private void doDelete(int dataIndex, Map rec) throws URISyntaxException { + StringBuilder sb = new StringBuilder(); + sb.append("Table name = ").append(currentTableInfo.tableName()).append("\r\n"); + sb.append("Partition key ").append(getPartitionKeyName()).append(" = ") // + .append(rec.get(partitionKeyName).toString()).append("\r\n"); + if (hasSortKey) { + sb.append("Sort key ").append(getSortKeyName()) // + .append(" = ").append(rec.get(sortKeyName).toString()).append("\r\n"); + } + + Alert confirmDialog = new Alert(AlertType.CONFIRMATION); + confirmDialog.setHeaderText("Delete Information"); + // confirmDialog.getDialogPane().getButtonTypes().add(ButtonType.OK); + // confirmDialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL); + confirmDialog.setContentText(sb.toString()); + ButtonType retType = confirmDialog.showAndWait().get(); + if (retType == ButtonType.OK) { + DeleteItemDao dao = new DeleteItemDao(connInfo); + dao.deleteItem(currentTableInfo, rec); + + dynamoDbResult.removeRecord(dataIndex); + tableResultList.getItems().remove(dataIndex); } } @SuppressWarnings("unchecked") private List> getPositionList( - TableViewSelectionModel> selectedModel) { + TableViewSelectionModel selectedModel) { @SuppressWarnings("rawtypes") ObservableList selPosList = selectedModel.getSelectedCells(); List> posList = new ArrayList<>(); - for (TablePosition, String> position : selPosList) { + for (TablePosition position : selPosList) { posList.add(new Pair(position.getColumn(), position.getRow())); } posList.sort(new Comparator>() { @@ -616,7 +625,7 @@ private void setTable(DynamoDbResult result) { tableResultList.getColumns().clear(); for (int colIdx = 0; colIdx < result.getColumnCount(); colIdx++) { String columnName = result.getDynamoDbColumn(colIdx).getColumnName(); - TableColumn, String> dataCol = getTableColumn(columnName, colIdx); + TableColumn dataCol = getTableColumn(columnName, colIdx); dataCol.setCellFactory(TextFieldTableCell.forTableColumn()); dataCol.setMaxWidth(TBL_COL_MAX_WIDTH); tableResultList.getColumns().add(dataCol); @@ -625,9 +634,11 @@ private void setTable(DynamoDbResult result) { tableResultList.getItems().addAll(result.getResultItems()); } - private TableColumn, String> getTableColumn(String columnName, final int finalColIdx) { - TableColumn, String> dataCol = new TableColumn<>(columnName); - dataCol.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue().get(finalColIdx))); + private TableColumn getTableColumn(String columnName, final int finalColIdx) { + TableColumn dataCol = new TableColumn<>(columnName); + dataCol.setCellValueFactory( + param -> new ReadOnlyObjectWrapper<>(param.getValue().getData().get(finalColIdx))); + dataCol.setId(columnName); return dataCol; }