From e7ebe5371853d3e26141a9ac88985cabe891cf03 Mon Sep 17 00:00:00 2001 From: Taka Date: Thu, 2 Jul 2020 12:03:01 +0000 Subject: [PATCH] Handle VASSAL crashing when updating scenarios. --- vasl_templates/webapp/static/vassal.js | 6 ++- vasl_templates/webapp/vassal.py | 11 ++++ vassal-shim/release/vassal-shim.jar | Bin 29503 -> 30002 bytes vassal-shim/src/vassal_shim/ReportNode.java | 11 ++++ vassal-shim/src/vassal_shim/VassalShim.java | 55 +++++++++++++++----- 5 files changed, 68 insertions(+), 15 deletions(-) diff --git a/vasl_templates/webapp/static/vassal.js b/vasl_templates/webapp/static/vassal.js index 1451381..9d4fc82 100644 --- a/vasl_templates/webapp/static/vassal.js +++ b/vasl_templates/webapp/static/vassal.js @@ -72,8 +72,10 @@ function _show_label_report_msg( report ) buf.push( "" ) ; var msg = buf.join( "" ) ; - // show the message - if ( report.labels_deleted > 0 ) + // show the summary and any error messages + for ( i=0 ; i < report.errors.length ; ++i ) + showErrorMsg( report.errors[i] ) ; + if ( report.labels_deleted > 0 || report.errors.length > 0 ) showWarningMsg( msg ) ; else showInfoMsg( msg ) ; diff --git a/vasl_templates/webapp/vassal.py b/vasl_templates/webapp/vassal.py index 89444d8..02d1d0e 100644 --- a/vasl_templates/webapp/vassal.py +++ b/vasl_templates/webapp/vassal.py @@ -95,6 +95,12 @@ def update_vsav(): #pylint: disable=too-many-statements,too-many-locals logger.info( "Updated the VSAV file OK: elapsed=%.3fs", time.time()-start_time ) # NOTE: We adjust the recommended save filename to encourage users to not overwrite the original file :-/ vsav_filename = os.path.split( vsav_filename )[1] + errors = [] + for fail in report["failed"]: + if fail.get("message"): + errors.append( "{}
{}
".format( fail["caption"], fail["message"] ) ) + else: + errors.append( fail["caption"] ) return jsonify( { "vsav_data": base64.b64encode(vsav_data).decode( "utf-8" ), "filename": vsav_filename, @@ -104,6 +110,7 @@ def update_vsav(): #pylint: disable=too-many-statements,too-many-locals "labels_updated": len(report["updated"]), "labels_deleted": len(report["deleted"]), "labels_unchanged": len(report["unchanged"]), + "errors": errors, }, } ) @@ -182,6 +189,10 @@ def _parse_label_report( fname ): nodes.append( { "id": node.attrib["id"] } ) if "x" in node.attrib and "y" in node.attrib: nodes[-1]["pos"] = ( node.attrib["x"], node.attrib["y"] ) + if "caption" in node.attrib: + nodes[-1]["caption"] = node.attrib["caption"] + if node.text: + nodes[-1]["message"] = node.text report[ action.tag ] = nodes return report diff --git a/vassal-shim/release/vassal-shim.jar b/vassal-shim/release/vassal-shim.jar index ffd038f68694d26b39d0a7a7a67fedf59b4f50ce..8054b53a848ea7182b0c3fa23b6f56586b7be31b 100644 GIT binary patch delta 15511 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 GlK%&}jKxL( diff --git a/vassal-shim/src/vassal_shim/ReportNode.java b/vassal-shim/src/vassal_shim/ReportNode.java index 4d772d8..0ab467c 100644 --- a/vassal-shim/src/vassal_shim/ReportNode.java +++ b/vassal-shim/src/vassal_shim/ReportNode.java @@ -10,6 +10,17 @@ public class ReportNode String snippetId ; Point labelPos ; + String caption ; + String msg ; + + public ReportNode( String snippetId, Point labelPos, String caption, String msg ) + { + // initialize the ReportNode + this.snippetId = snippetId ; + this.labelPos = labelPos ; + this.caption = caption ; + this.msg = msg ; + } public ReportNode( String snippetId, Point labelPos ) { diff --git a/vassal-shim/src/vassal_shim/VassalShim.java b/vassal-shim/src/vassal_shim/VassalShim.java index f3f1713..0fade33 100644 --- a/vassal-shim/src/vassal_shim/VassalShim.java +++ b/vassal-shim/src/vassal_shim/VassalShim.java @@ -377,7 +377,7 @@ public class VassalShim { // initialize Map< String, ArrayList > labelReport = new HashMap>() ; - for ( String key: new String[]{"created","updated","deleted","unchanged"} ) + for ( String key: new String[]{"created","updated","deleted","unchanged","failed"} ) labelReport.put( key, new ArrayList() ) ; // process each snippet @@ -419,8 +419,16 @@ public class VassalShim logger.info( "- Updating label: {}", snippetId ) ; logger.debug( " - curr state: " + Utils.printableString(currState) ) ; logger.debug( " - new state: " + Utils.printableString(newState) ) ; - labelFields.gamePiece().setState( newState ) ; - labelReport.get( "updated" ).add( new ReportNode( snippetId, null ) ) ; + try { + labelFields.gamePiece().setState( newState ) ; + labelReport.get( "updated" ).add( new ReportNode( snippetId, null ) ) ; + } catch( Exception ex ) { + String msg = "ERROR: Couldn't update label '" + snippetId + "'" ; + logger.warn( msg, ex ) ; + labelReport.get( "failed" ).add( + new ReportNode( snippetId, null, msg, ex.getMessage() ) + ) ; + } } iter.remove() ; } @@ -433,8 +441,16 @@ public class VassalShim logger.info( "- Deleting label: {}", snippetId ) ; GamePieceLabelFields labelFields = ourLabels.get( snippetId ) ; RemovePiece cmd = new RemovePiece( labelFields.gamePiece() ) ; - cmd.execute() ; - labelReport.get( "deleted" ).add( new ReportNode( snippetId, null ) ) ; + try { + cmd.execute() ; + labelReport.get( "deleted" ).add( new ReportNode( snippetId, null ) ) ; + } catch( Exception ex ) { + String msg = "ERROR: Couldn't delete label '" + snippetId + "'" ; + logger.warn( msg, ex ) ; + labelReport.get( "failed" ).add( + new ReportNode( snippetId, null, msg, ex.getMessage() ) + ) ; + } } // We now want to create new labels for any snippets left that haven't already been processed. @@ -630,14 +646,22 @@ public class VassalShim String defaultLabelText1 = config.getProperty( "DEFAULT_LABEL_TEXT1", "Label" ) ; String defaultLabelText2 = config.getProperty( "DEFAULT_LABEL_TEXT2", "no background" ) ; String snippetContent = snippet.content.replace( "\n", " " ) ; - gamePiece.setState( - gamePiece.getState().replace( "\t"+defaultUserName+"\\", "\tvasl-templates\\" ) - .replace( "\t"+defaultLabelText1+"\\", "\t" + snippetContent + "\\" ) - .replace( "\t"+defaultLabelText2+"\\", "\t\\" ) - .replace( "\tnull;0;0", "\tMap0;" + makeVassalCoordString(pos,snippet) ) - ) ; - GameModule.getGameModule().getGameState().addPiece( gamePiece ) ; - labelReport.get( "created" ).add( new ReportNode( snippetId, pos ) ) ; + try { + gamePiece.setState( + gamePiece.getState().replace( "\t"+defaultUserName+"\\", "\tvasl-templates\\" ) + .replace( "\t"+defaultLabelText1+"\\", "\t" + snippetContent + "\\" ) + .replace( "\t"+defaultLabelText2+"\\", "\t\\" ) + .replace( "\tnull;0;0", "\tMap0;" + makeVassalCoordString(pos,snippet) ) + ) ; + GameModule.getGameModule().getGameState().addPiece( gamePiece ) ; + labelReport.get( "created" ).add( new ReportNode( snippetId, pos ) ) ; + } catch( Exception ex ) { + String msg = "ERROR: Couldn't create label '" + snippetId + "'" ; + logger.warn( msg, ex ) ; + labelReport.get( "failed" ).add( + new ReportNode( snippetId, null, msg, ex.getMessage() ) + ) ; + } } return labelReport ; @@ -716,6 +740,11 @@ public class VassalShim reportNodeElem.setAttribute( "x", Integer.toString( reportNode.labelPos.x ) ) ; reportNodeElem.setAttribute( "y", Integer.toString( reportNode.labelPos.y ) ) ; } + if ( reportNode.caption != null ) { + reportNodeElem.setAttribute( "caption", reportNode.caption ) ; + if ( reportNode.msg != null ) + reportNodeElem.setTextContent( reportNode.msg ) ; + } elem.appendChild( reportNodeElem ) ; if ( ! key.equals( "unchanged" ) ) wasModified = true ;