Merge lp:~tapaal-contributor/tapaal/cpn-gui-dev into lp:tapaal

Proposed by Kenneth Yrke Jørgensen
Status: Merged
Merge reported by: Kenneth Yrke Jørgensen
Merged at revision: not available
Proposed branch: lp:~tapaal-contributor/tapaal/cpn-gui-dev
Merge into: lp:tapaal
Diff against target: 54815 lines (+28398/-10092)
463 files modified
build.gradle (+33/-57)
gradle/wrapper/gradle-wrapper.properties (+5/-6)
gradlew (+2/-0)
gradlew.bat (+4/-18)
src/dk/aau/cs/util/ExecutabilityChecker.java (+0/-42)
src/main/java/dk/aau/cs/TCTL/AritmeticOperator.java (+1/-1)
src/main/java/dk/aau/cs/TCTL/LTLGNode.java (+1/-1)
src/main/java/dk/aau/cs/TCTL/LTLUNode.java (+1/-1)
src/main/java/dk/aau/cs/TCTL/StringPosition.java (+2/-3)
src/main/java/dk/aau/cs/TCTL/TCTLAUNode.java (+1/-1)
src/main/java/dk/aau/cs/TCTL/TCTLAbstractProperty.java (+0/-2)
src/main/java/dk/aau/cs/TCTL/TCTLAbstractStateProperty.java (+0/-14)
src/main/java/dk/aau/cs/TCTL/TCTLAndListNode.java (+1/-2)
src/main/java/dk/aau/cs/TCTL/TCTLAtomicPropositionNode.java (+0/-25)
src/main/java/dk/aau/cs/TCTL/TCTLConstNode.java (+1/-1)
src/main/java/dk/aau/cs/TCTL/TCTLEFNode.java (+0/-2)
src/main/java/dk/aau/cs/TCTL/TCTLOrListNode.java (+1/-2)
src/main/java/dk/aau/cs/TCTL/TCTLPlusListNode.java (+1/-1)
src/main/java/dk/aau/cs/TCTL/TCTLTermListNode.java (+1/-1)
src/main/java/dk/aau/cs/TCTL/XMLParsing/XMLCTLQueryParser.java (+36/-34)
src/main/java/dk/aau/cs/TCTL/visitors/AddTemplateVisitor.java (+1/-1)
src/main/java/dk/aau/cs/TCTL/visitors/BroadcastTranslationQueryVisitor.java (+2/-2)
src/main/java/dk/aau/cs/TCTL/visitors/CTLQueryVisitor.java (+265/-248)
src/main/java/dk/aau/cs/TCTL/visitors/CombiTranslationQueryVisitor.java (+7/-7)
src/main/java/dk/aau/cs/TCTL/visitors/ContainsPlaceWithDisabledTemplateVisitor.java (+10/-7)
src/main/java/dk/aau/cs/TCTL/visitors/ContainsSharedPlaceVisitor.java (+4/-3)
src/main/java/dk/aau/cs/TCTL/visitors/ContainsSharedTransitionVisitor.java (+1/-1)
src/main/java/dk/aau/cs/TCTL/visitors/FixAbbrivPlaceNames.java (+1/-10)
src/main/java/dk/aau/cs/TCTL/visitors/FixAbbrivTransitionNames.java (+1/-1)
src/main/java/dk/aau/cs/TCTL/visitors/HasDeadlockVisitor.java (+1/-1)
src/main/java/dk/aau/cs/TCTL/visitors/IsReachabilityVisitor.java (+1/-1)
src/main/java/dk/aau/cs/TCTL/visitors/LTLQueryVisitor.java (+100/-89)
src/main/java/dk/aau/cs/TCTL/visitors/OptimizedStandardTranslationQueryVisitor.java (+2/-2)
src/main/java/dk/aau/cs/TCTL/visitors/RenamePlaceTCTLVisitor.java (+2/-2)
src/main/java/dk/aau/cs/TCTL/visitors/RenameTransitionTCTLVisitor.java (+2/-2)
src/main/java/dk/aau/cs/TCTL/visitors/StandardTranslationQueryVisitor.java (+1/-1)
src/main/java/dk/aau/cs/TCTL/visitors/VerifyPlaceNamesVisitor.java (+4/-5)
src/main/java/dk/aau/cs/TCTL/visitors/VerifyTransitionNamesVisitor.java (+4/-5)
src/main/java/dk/aau/cs/approximation/ApproximationWorker.java (+185/-117)
src/main/java/dk/aau/cs/approximation/OverApproximation.java (+10/-9)
src/main/java/dk/aau/cs/approximation/UnderApproximation.java (+43/-55)
src/main/java/dk/aau/cs/io/LoadTACPN.java (+439/-0)
src/main/java/dk/aau/cs/io/LoadedModel.java (+11/-9)
src/main/java/dk/aau/cs/io/LoadedQueries.java (+1/-2)
src/main/java/dk/aau/cs/io/ModelLoader.java (+3/-3)
src/main/java/dk/aau/cs/io/NetWriter.java (+3/-3)
src/main/java/dk/aau/cs/io/PNMLWriter.java (+150/-26)
src/main/java/dk/aau/cs/io/PNMLoader.java (+521/-453)
src/main/java/dk/aau/cs/io/TapnEngineXmlLoader.java (+993/-0)
src/main/java/dk/aau/cs/io/TapnLegacyXmlLoader.java (+58/-54)
src/main/java/dk/aau/cs/io/TapnXmlLoader.java (+397/-110)
src/main/java/dk/aau/cs/io/TimedArcPetriNetNetworkWriter.java (+146/-39)
src/main/java/dk/aau/cs/io/TraceImportExport.java (+25/-22)
src/main/java/dk/aau/cs/io/XMLFormatter.java (+1/-1)
src/main/java/dk/aau/cs/io/batchProcessing/BatchProcessingResultsExporter.java (+4/-4)
src/main/java/dk/aau/cs/io/batchProcessing/LoadedBatchProcessingModel.java (+1/-1)
src/main/java/dk/aau/cs/io/queries/QueryLoader.java (+2/-5)
src/main/java/dk/aau/cs/io/queries/SUMOQueryLoader.java (+10/-12)
src/main/java/dk/aau/cs/io/queries/TAPNQueryLoader.java (+35/-16)
src/main/java/dk/aau/cs/io/queries/XMLQueryLoader.java (+37/-18)
src/main/java/dk/aau/cs/io/writeTACPN.java (+455/-0)
src/main/java/dk/aau/cs/model/CPN/Color.java (+137/-0)
src/main/java/dk/aau/cs/model/CPN/ColorMultiset.java (+144/-0)
src/main/java/dk/aau/cs/model/CPN/ColorType.java (+142/-0)
src/main/java/dk/aau/cs/model/CPN/ColoredTimeInterval.java (+148/-0)
src/main/java/dk/aau/cs/model/CPN/ColoredTimeInvariant.java (+108/-0)
src/main/java/dk/aau/cs/model/CPN/ExpressionSupport/ExprStringPosition.java (+35/-0)
src/main/java/dk/aau/cs/model/CPN/ExpressionSupport/ExprValues.java (+40/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/AddExpression.java (+185/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/AllExpression.java (+137/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/AndExpression.java (+124/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/ArcExpression.java (+37/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/ColorExpression.java (+62/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/DotConstantExpression.java (+107/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/EqualityExpression.java (+119/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/Expression.java (+64/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/ExpressionContext.java (+31/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/GreaterThanEqExpression.java (+118/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/GreaterThanExpression.java (+121/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/GuardExpression.java (+30/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/InequalityExpression.java (+117/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/LeftRightGuardExpression.java (+6/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/LessThanEqExpression.java (+120/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/LessThanExpression.java (+121/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/NotExpression.java (+87/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/NumberOfExpression.java (+182/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/OrExpression.java (+124/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/PlaceHolderArcExpression.java (+76/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/PlaceHolderColorExpression.java (+106/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/PlaceHolderExpression.java (+5/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/PlaceHolderGuardExpression.java (+75/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/PredecessorExpression.java (+127/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/ScalarProductExpression.java (+114/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/SubtractExpression.java (+138/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/SuccessorExpression.java (+125/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/TupleExpression.java (+238/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/UserOperatorExpression.java (+140/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/UserSortExpression.java (+92/-0)
src/main/java/dk/aau/cs/model/CPN/Expressions/VariableExpression.java (+180/-0)
src/main/java/dk/aau/cs/model/CPN/ProductType.java (+188/-0)
src/main/java/dk/aau/cs/model/CPN/Variable.java (+34/-0)
src/main/java/dk/aau/cs/model/NTA/Location.java (+1/-1)
src/main/java/dk/aau/cs/model/NTA/trace/SymbolicState.java (+5/-5)
src/main/java/dk/aau/cs/model/NTA/trace/TimeDelayFiringAction.java (+2/-2)
src/main/java/dk/aau/cs/model/NTA/trace/TraceToken.java (+4/-11)
src/main/java/dk/aau/cs/model/NTA/trace/TransitionFiring.java (+5/-13)
src/main/java/dk/aau/cs/model/tapn/ConstantStore.java (+11/-12)
src/main/java/dk/aau/cs/model/tapn/IntWeight.java (+1/-1)
src/main/java/dk/aau/cs/model/tapn/LocalTimedMarking.java (+2/-2)
src/main/java/dk/aau/cs/model/tapn/LocalTimedPlace.java (+42/-5)
src/main/java/dk/aau/cs/model/tapn/NetworkMarking.java (+3/-3)
src/main/java/dk/aau/cs/model/tapn/RatBound.java (+4/-4)
src/main/java/dk/aau/cs/model/tapn/SharedPlace.java (+51/-13)
src/main/java/dk/aau/cs/model/tapn/SharedTransition.java (+20/-12)
src/main/java/dk/aau/cs/model/tapn/TAPNQuery.java (+1/-1)
src/main/java/dk/aau/cs/model/tapn/TimeInterval.java (+3/-3)
src/main/java/dk/aau/cs/model/tapn/TimeInvariant.java (+3/-3)
src/main/java/dk/aau/cs/model/tapn/TimedArcPetriNet.java (+65/-10)
src/main/java/dk/aau/cs/model/tapn/TimedArcPetriNetNetwork.java (+355/-18)
src/main/java/dk/aau/cs/model/tapn/TimedInhibitorArc.java (+12/-7)
src/main/java/dk/aau/cs/model/tapn/TimedInputArc.java (+58/-12)
src/main/java/dk/aau/cs/model/tapn/TimedOutputArc.java (+30/-3)
src/main/java/dk/aau/cs/model/tapn/TimedPlace.java (+55/-7)
src/main/java/dk/aau/cs/model/tapn/TimedToken.java (+50/-12)
src/main/java/dk/aau/cs/model/tapn/TimedTransition.java (+49/-10)
src/main/java/dk/aau/cs/model/tapn/TransportArc.java (+72/-10)
src/main/java/dk/aau/cs/model/tapn/simulation/ManualDelayMode.java (+6/-6)
src/main/java/dk/aau/cs/model/tapn/simulation/ShortestDelayMode.java (+2/-2)
src/main/java/dk/aau/cs/model/tapn/simulation/TAPNNetworkTimeDelayStep.java (+0/-4)
src/main/java/dk/aau/cs/model/tapn/simulation/TimeDelayStep.java (+3/-3)
src/main/java/dk/aau/cs/model/tapn/simulation/TimedArcPetriNetTrace.java (+2/-6)
src/main/java/dk/aau/cs/model/tapn/simulation/TimedTAPNNetworkTrace.java (+1/-1)
src/main/java/dk/aau/cs/translations/Degree2Converter.java (+14/-12)
src/main/java/dk/aau/cs/translations/ReductionOption.java (+1/-1)
src/main/java/dk/aau/cs/translations/tapn/BroadcastTranslation.java (+6/-5)
src/main/java/dk/aau/cs/translations/tapn/CombiTranslation.java (+6/-6)
src/main/java/dk/aau/cs/translations/tapn/Degree2BroadcastTranslation.java (+4/-3)
src/main/java/dk/aau/cs/translations/tapn/OptimizedStandardTranslation.java (+2/-1)
src/main/java/dk/aau/cs/translations/tapn/StandardTranslation.java (+2/-1)
src/main/java/dk/aau/cs/translations/tapn/TAPNToTimedConservativeTAPNConverter.java (+2/-0)
src/main/java/dk/aau/cs/util/FormatException.java (+4/-0)
src/main/java/dk/aau/cs/util/IntervalOperations.java (+8/-8)
src/main/java/dk/aau/cs/util/MemoryMonitor.java (+1/-2)
src/main/java/dk/aau/cs/util/Require.java (+0/-4)
src/main/java/dk/aau/cs/verification/BoundednessAnalysisResult.java (+3/-3)
src/main/java/dk/aau/cs/verification/BufferDrain.java (+7/-2)
src/main/java/dk/aau/cs/verification/EngineHelperFunctions.java (+94/-0)
src/main/java/dk/aau/cs/verification/ITAPNComposer.java (+2/-0)
src/main/java/dk/aau/cs/verification/IconSelector.java (+4/-4)
src/main/java/dk/aau/cs/verification/ModelChecker.java (+6/-3)
src/main/java/dk/aau/cs/verification/ProcessRunner.java (+2/-2)
src/main/java/dk/aau/cs/verification/QueryResult.java (+29/-7)
src/main/java/dk/aau/cs/verification/ReductionStats.java (+27/-30)
src/main/java/dk/aau/cs/verification/Stats.java (+9/-23)
src/main/java/dk/aau/cs/verification/TAPNComposer.java (+85/-65)
src/main/java/dk/aau/cs/verification/TAPNTraceDecomposer.java (+3/-2)
src/main/java/dk/aau/cs/verification/TraceConverter.java (+3/-2)
src/main/java/dk/aau/cs/verification/UPPAAL/UppaalIconSelector.java (+1/-1)
src/main/java/dk/aau/cs/verification/UPPAAL/Verifyta.java (+37/-88)
src/main/java/dk/aau/cs/verification/UPPAAL/VerifytaOptions.java (+4/-4)
src/main/java/dk/aau/cs/verification/UPPAAL/VerifytaTraceInterpreter.java (+3/-2)
src/main/java/dk/aau/cs/verification/VerificationOptions.java (+12/-6)
src/main/java/dk/aau/cs/verification/VerificationResult.java (+45/-29)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyCPNExporter.java (+149/-0)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyDTAPN.java (+144/-150)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyDTAPNOptions.java (+95/-22)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyDTAPNUnfoldOptions.java (+68/-0)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyPN.java (+463/-429)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyPNCTLOutputParser.java (+8/-1)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyPNExporter.java (+5/-1)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyPNOptions.java (+152/-79)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyPNOutputParser.java (+8/-1)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyPNUnfoldOptions.java (+100/-0)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyTACPNExporter.java (+32/-0)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyTAPN.java (+151/-144)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyTAPNExporter.java (+81/-74)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyTAPNOptions.java (+52/-21)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyTAPNOutputParser.java (+19/-2)
src/main/java/dk/aau/cs/verification/VerifyTAPN/VerifyTAPNTraceParser.java (+3/-1)
src/main/java/dk/aau/cs/verification/batchProcessing/BatchProcessingVerificationOptions.java (+3/-8)
src/main/java/dk/aau/cs/verification/batchProcessing/BatchProcessingVerificationResult.java (+1/-1)
src/main/java/dk/aau/cs/verification/batchProcessing/BatchProcessingWorker.java (+61/-66)
src/main/java/net/tapaal/Preferences.java (+8/-0)
src/main/java/net/tapaal/TAPAAL.java (+20/-26)
src/main/java/net/tapaal/copypaste/CopyPastImportExport.kt (+312/-0)
src/main/java/net/tapaal/export/TikZExporter.java (+215/-147)
src/main/java/net/tapaal/gui/DrawingSurfaceManager/AbstractDrawingSurfaceManager.java (+9/-4)
src/main/java/net/tapaal/gui/FileDropTarget.kt (+53/-0)
src/main/java/net/tapaal/gui/GuiFrameActions.java (+16/-10)
src/main/java/net/tapaal/gui/GuiFrameController.java (+149/-110)
src/main/java/net/tapaal/gui/GuiFrameControllerActions.java (+12/-7)
src/main/java/net/tapaal/gui/SafeGuiFrameActions.java (+3/-3)
src/main/java/net/tapaal/gui/TabActions.java (+28/-12)
src/main/java/net/tapaal/gui/debug/Debug.kt (+32/-0)
src/main/java/net/tapaal/gui/debug/UndoRedoSpy.kt (+53/-0)
src/main/java/net/tapaal/gui/petrinet/Context.java (+10/-9)
src/main/java/net/tapaal/gui/petrinet/NameGenerator.java (+1/-1)
src/main/java/net/tapaal/gui/petrinet/TAPNLens.java (+27/-0)
src/main/java/net/tapaal/gui/petrinet/TabTransformer.java (+185/-11)
src/main/java/net/tapaal/gui/petrinet/Template.java (+3/-2)
src/main/java/net/tapaal/gui/petrinet/animation/AnimationTokenSelectDialog.java (+3/-3)
src/main/java/net/tapaal/gui/petrinet/animation/ArcTokenSelector.java (+5/-5)
src/main/java/net/tapaal/gui/petrinet/animation/DelayEnabledTransitionControl.java (+3/-3)
src/main/java/net/tapaal/gui/petrinet/animation/TransitionFiringComponent.java (+15/-14)
src/main/java/net/tapaal/gui/petrinet/dialog/BatchProcessingDialog.java (+80/-122)
src/main/java/net/tapaal/gui/petrinet/dialog/BatchProcessingResultsTableModel.java (+2/-2)
src/main/java/net/tapaal/gui/petrinet/dialog/ExportBatchDialog.java (+25/-21)
src/main/java/net/tapaal/gui/petrinet/dialog/ExportBatchResultTableModel.java (+1/-1)
src/main/java/net/tapaal/gui/petrinet/dialog/FileNameCellRenderer.java (+1/-1)
src/main/java/net/tapaal/gui/petrinet/dialog/NameVisibilityPanel.java (+7/-7)
src/main/java/net/tapaal/gui/petrinet/dialog/NewTAPNPanel.java (+93/-31)
src/main/java/net/tapaal/gui/petrinet/dialog/QueryDialog.java (+319/-205)
src/main/java/net/tapaal/gui/petrinet/dialog/StatisticsPanel.java (+16/-16)
src/main/java/net/tapaal/gui/petrinet/dialog/UnfoldDialog.java (+179/-0)
src/main/java/net/tapaal/gui/petrinet/dialog/WorkflowDialog.java (+63/-55)
src/main/java/net/tapaal/gui/petrinet/editor/ColorComboBoxRenderer.java (+52/-0)
src/main/java/net/tapaal/gui/petrinet/editor/ColorComboboxPanel.java (+192/-0)
src/main/java/net/tapaal/gui/petrinet/editor/ColorTypeDialogPanel.java (+1145/-0)
src/main/java/net/tapaal/gui/petrinet/editor/ColoredArcGuardPanel.java (+1203/-0)
src/main/java/net/tapaal/gui/petrinet/editor/ColoredTimeIntervalDialogPanel.java (+446/-0)
src/main/java/net/tapaal/gui/petrinet/editor/ColoredTimeInvariantDialogPanel.java (+318/-0)
src/main/java/net/tapaal/gui/petrinet/editor/ColoredTransitionGuardPanel.java (+1015/-0)
src/main/java/net/tapaal/gui/petrinet/editor/ColortypeListCellRenderer.java (+59/-0)
src/main/java/net/tapaal/gui/petrinet/editor/ConstantsDialogPanel.java (+36/-34)
src/main/java/net/tapaal/gui/petrinet/editor/ConstantsListModel.java (+2/-2)
src/main/java/net/tapaal/gui/petrinet/editor/ConstantsPane.java (+669/-213)
src/main/java/net/tapaal/gui/petrinet/editor/DeleteSharedPlaceOrTransitionAction.java (+49/-36)
src/main/java/net/tapaal/gui/petrinet/editor/SharedPlaceNamePanel.java (+8/-12)
src/main/java/net/tapaal/gui/petrinet/editor/SharedPlacesAndTransitionsPanel.java (+29/-41)
src/main/java/net/tapaal/gui/petrinet/editor/SharedTransitionNamePanel.java (+12/-15)
src/main/java/net/tapaal/gui/petrinet/editor/TemplateExplorer.java (+135/-278)
src/main/java/net/tapaal/gui/petrinet/editor/VariablesDialogPanel.java (+328/-0)
src/main/java/net/tapaal/gui/petrinet/model/GuiModelManager.java (+523/-0)
src/main/java/net/tapaal/gui/petrinet/model/ModelViolation.java (+19/-0)
src/main/java/net/tapaal/gui/petrinet/model/RequirementChecker.java (+28/-0)
src/main/java/net/tapaal/gui/petrinet/model/Result.java (+29/-0)
src/main/java/net/tapaal/gui/petrinet/smartdraw/SmartDrawDialog.java (+90/-289)
src/main/java/net/tapaal/gui/petrinet/smartdraw/SmartDrawListener.java (+1/-1)
src/main/java/net/tapaal/gui/petrinet/smartdraw/SmartDrawWorker.java (+65/-51)
src/main/java/net/tapaal/gui/petrinet/undo/AddConstantEditCommand.java (+6/-7)
src/main/java/net/tapaal/gui/petrinet/undo/AddFileBatchProcessingCommand.java (+4/-4)
src/main/java/net/tapaal/gui/petrinet/undo/AddFileExportBatchCommand.java (+2/-3)
src/main/java/net/tapaal/gui/petrinet/undo/AddQueryCommand.java (+5/-6)
src/main/java/net/tapaal/gui/petrinet/undo/AddSharedPlaceCommand.java (+2/-2)
src/main/java/net/tapaal/gui/petrinet/undo/AddSharedTransitionCommand.java (+2/-2)
src/main/java/net/tapaal/gui/petrinet/undo/AddTemplateCommand.java (+3/-4)
src/main/java/net/tapaal/gui/petrinet/undo/AddTimedInhibitorArcCommand.java (+4/-3)
src/main/java/net/tapaal/gui/petrinet/undo/AddTimedInputArcCommand.java (+4/-3)
src/main/java/net/tapaal/gui/petrinet/undo/AddTimedOutputArcCommand.java (+4/-3)
src/main/java/net/tapaal/gui/petrinet/undo/AddTimedPlaceCommand.java (+4/-3)
src/main/java/net/tapaal/gui/petrinet/undo/AddTimedTransitionCommand.java (+4/-3)
src/main/java/net/tapaal/gui/petrinet/undo/AddTransportArcCommand.java (+4/-3)
src/main/java/net/tapaal/gui/petrinet/undo/ChangeAllNamesVisibilityCommand.java (+7/-7)
src/main/java/net/tapaal/gui/petrinet/undo/ChangeSpacingEditCommand.java (+7/-8)
src/main/java/net/tapaal/gui/petrinet/undo/ChangedInvariantCommand.java (+1/-1)
src/main/java/net/tapaal/gui/petrinet/undo/Colored/AddColorTypeCommand.java (+30/-0)
src/main/java/net/tapaal/gui/petrinet/undo/Colored/AddVariableCommand.java (+29/-0)
src/main/java/net/tapaal/gui/petrinet/undo/Colored/ColoredPlaceMarkingEditCommand.java (+78/-0)
src/main/java/net/tapaal/gui/petrinet/undo/Colored/RemoveColorTypeFromNetworkCommand.java (+33/-0)
src/main/java/net/tapaal/gui/petrinet/undo/Colored/RemoveVariableFromNetworkCommand.java (+33/-0)
src/main/java/net/tapaal/gui/petrinet/undo/Colored/SetArcExpressionCommand.java (+29/-0)
src/main/java/net/tapaal/gui/petrinet/undo/Colored/SetColoredArcIntervalsCommand.java (+30/-0)
src/main/java/net/tapaal/gui/petrinet/undo/Colored/SetTransitionExpressionCommand.java (+29/-0)
src/main/java/net/tapaal/gui/petrinet/undo/Colored/SetTransportArcExpressionsCommand.java (+35/-0)
src/main/java/net/tapaal/gui/petrinet/undo/Colored/UpdateColorTypeCommand.java (+78/-0)
src/main/java/net/tapaal/gui/petrinet/undo/Colored/UpdatePTColorTypeCommand.java (+31/-0)
src/main/java/net/tapaal/gui/petrinet/undo/Colored/UpdateVariableCommand.java (+40/-0)
src/main/java/net/tapaal/gui/petrinet/undo/Command.java (+1/-1)
src/main/java/net/tapaal/gui/petrinet/undo/DeleteQueriesCommand.java (+5/-5)
src/main/java/net/tapaal/gui/petrinet/undo/DeleteSharedPlaceCommand.java (+2/-2)
src/main/java/net/tapaal/gui/petrinet/undo/DeleteSharedTransitionCommand.java (+2/-2)
src/main/java/net/tapaal/gui/petrinet/undo/DeleteTimedInhibitorArcCommand.java (+4/-3)
src/main/java/net/tapaal/gui/petrinet/undo/DeleteTimedInputArcCommand.java (+4/-3)
src/main/java/net/tapaal/gui/petrinet/undo/DeleteTimedOutputArcCommand.java (+4/-3)
src/main/java/net/tapaal/gui/petrinet/undo/DeleteTimedPlaceCommand.java (+12/-10)
src/main/java/net/tapaal/gui/petrinet/undo/DeleteTimedTransitionCommand.java (+4/-3)
src/main/java/net/tapaal/gui/petrinet/undo/DeleteTransportArcCommand.java (+4/-3)
src/main/java/net/tapaal/gui/petrinet/undo/MakePlaceNewSharedCommand.java (+17/-9)
src/main/java/net/tapaal/gui/petrinet/undo/MakePlaceNewSharedMultiCommand.java (+14/-7)
src/main/java/net/tapaal/gui/petrinet/undo/MakePlaceSharedCommand.java (+7/-7)
src/main/java/net/tapaal/gui/petrinet/undo/MakeTransitionNewSharedCommand.java (+4/-4)
src/main/java/net/tapaal/gui/petrinet/undo/MakeTransitionNewSharedMultiCommand.java (+6/-6)
src/main/java/net/tapaal/gui/petrinet/undo/MakeTransitionSharedCommand.java (+5/-5)
src/main/java/net/tapaal/gui/petrinet/undo/MoveElementDownCommand.java (+2/-2)
src/main/java/net/tapaal/gui/petrinet/undo/MoveElementUpCommand.java (+2/-2)
src/main/java/net/tapaal/gui/petrinet/undo/MovePlaceTransitionObjectCommand.java (+14/-13)
src/main/java/net/tapaal/gui/petrinet/undo/RemoveConstantEditCommand.java (+6/-7)
src/main/java/net/tapaal/gui/petrinet/undo/RemoveFileBatchProcessingCommand.java (+2/-2)
src/main/java/net/tapaal/gui/petrinet/undo/RemoveFileExportBatchCommand.java (+2/-3)
src/main/java/net/tapaal/gui/petrinet/undo/RemoveQueriesCommand.java (+8/-9)
src/main/java/net/tapaal/gui/petrinet/undo/RemoveTemplateCommand.java (+7/-7)
src/main/java/net/tapaal/gui/petrinet/undo/RenameSharedPlaceCommand.java (+6/-6)
src/main/java/net/tapaal/gui/petrinet/undo/RenameSharedTransitionCommand.java (+6/-6)
src/main/java/net/tapaal/gui/petrinet/undo/RenameTemplateCommand.java (+6/-7)
src/main/java/net/tapaal/gui/petrinet/undo/RenameTimedPlaceCommand.java (+5/-5)
src/main/java/net/tapaal/gui/petrinet/undo/RenameTimedTransitionCommand.java (+5/-5)
src/main/java/net/tapaal/gui/petrinet/undo/SortConstantsCommand.java (+5/-5)
src/main/java/net/tapaal/gui/petrinet/undo/SortQueriesCommand.java (+1/-1)
src/main/java/net/tapaal/gui/petrinet/undo/SortSharedPlacesCommand.java (+2/-2)
src/main/java/net/tapaal/gui/petrinet/undo/SortSharedTransitionsCommand.java (+2/-2)
src/main/java/net/tapaal/gui/petrinet/undo/SortTemplatesCommand.java (+6/-6)
src/main/java/net/tapaal/gui/petrinet/undo/TimedPlaceMarkingEditCommand.java (+4/-4)
src/main/java/net/tapaal/gui/petrinet/undo/ToggleTemplateActivationCommand.java (+3/-4)
src/main/java/net/tapaal/gui/petrinet/undo/ToggleTransitionUncontrollableCommand.java (+5/-5)
src/main/java/net/tapaal/gui/petrinet/undo/ToggleTransitionUrgentCommand.java (+5/-5)
src/main/java/net/tapaal/gui/petrinet/undo/UndoRedoBuffer.java (+95/-0)
src/main/java/net/tapaal/gui/petrinet/undo/UnsharePlaceCommand.java (+2/-2)
src/main/java/net/tapaal/gui/petrinet/undo/UnshareTransitionCommand.java (+1/-1)
src/main/java/net/tapaal/gui/petrinet/undo/UpdateConstantEditCommand.java (+7/-8)
src/main/java/net/tapaal/gui/petrinet/undo/UpdateNameLabelOffsetCommand.java (+2/-2)
src/main/java/net/tapaal/gui/petrinet/verification/ChooseInclusionPlacesDialog.java (+17/-21)
src/main/java/net/tapaal/gui/petrinet/verification/EngineDialogPanel.java (+16/-13)
src/main/java/net/tapaal/gui/petrinet/verification/EngineSupportOptions.java (+5/-5)
src/main/java/net/tapaal/gui/petrinet/verification/InclusionPlaces.java (+1/-1)
src/main/java/net/tapaal/gui/petrinet/verification/KBoundAnalyzer.java (+36/-23)
src/main/java/net/tapaal/gui/petrinet/verification/RunKBoundAnalysis.java (+12/-8)
src/main/java/net/tapaal/gui/petrinet/verification/RunVerification.java (+157/-152)
src/main/java/net/tapaal/gui/petrinet/verification/RunVerificationBase.java (+172/-146)
src/main/java/net/tapaal/gui/petrinet/verification/RunningVerificationDialog.java (+12/-6)
src/main/java/net/tapaal/gui/petrinet/verification/TAPNQuery.java (+78/-15)
src/main/java/net/tapaal/gui/petrinet/verification/UPPAAALStandardOptions.java (+3/-2)
src/main/java/net/tapaal/gui/petrinet/verification/UPPAALBroadcastDegree2Options.java (+3/-2)
src/main/java/net/tapaal/gui/petrinet/verification/UPPAALBroadcastOptions.java (+3/-2)
src/main/java/net/tapaal/gui/petrinet/verification/UPPAALCombiOptions.java (+3/-2)
src/main/java/net/tapaal/gui/petrinet/verification/UPPAALOptimizedStandardOptions.java (+3/-2)
src/main/java/net/tapaal/gui/petrinet/verification/UnfoldNet.java (+354/-0)
src/main/java/net/tapaal/gui/petrinet/verification/Verifier.java (+229/-199)
src/main/java/net/tapaal/gui/petrinet/verification/VerifyDTAPNEngineOptions.java (+3/-2)
src/main/java/net/tapaal/gui/petrinet/verification/VerifyPNEngineOptions.java (+3/-2)
src/main/java/net/tapaal/gui/petrinet/verification/VerifyTAPNEngineOptions.java (+3/-2)
src/main/java/net/tapaal/gui/petrinet/widgets/QueryPane.java (+43/-56)
src/main/java/net/tapaal/gui/petrinet/widgets/SidePane.java (+1/-1)
src/main/java/net/tapaal/gui/swingcomponents/BugHandledJXMultisplitPane.java (+1/-1)
src/main/java/net/tapaal/gui/swingcomponents/MultiLineAutoWrappingToolTip.java (+1/-1)
src/main/java/net/tapaal/gui/swingcomponents/MultiLineAutoWrappingTooltipUI.java (+1/-1)
src/main/java/net/tapaal/gui/swingcomponents/NonsearchableJComboBox.java (+1/-1)
src/main/java/net/tapaal/gui/swingcomponents/NonsearchableJList.java (+1/-1)
src/main/java/net/tapaal/resourcemanager/ResourceManager.java (+1/-1)
src/main/java/net/tapaal/swinghelpers/CustomJSpinner.java (+0/-1)
src/main/java/net/tapaal/swinghelpers/DecimalOnlyDocumentFilter.java (+43/-47)
src/main/java/net/tapaal/swinghelpers/DispatchEventsToParentHandler.java (+36/-36)
src/main/java/net/tapaal/swinghelpers/GridBagHelper.java (+12/-6)
src/main/java/net/tapaal/swinghelpers/RequestFocusListener.java (+0/-3)
src/main/java/net/tapaal/swinghelpers/ToggleButtonWithoutText.java (+0/-1)
src/main/java/net/tapaal/versioncheck/VersionChecker.java (+2/-2)
src/main/java/pipe/gui/Constants.java (+10/-16)
src/main/java/pipe/gui/FileFinder.java (+1/-1)
src/main/java/pipe/gui/GuiFrame.java (+283/-176)
src/main/java/pipe/gui/MessengerImpl.java (+1/-1)
src/main/java/pipe/gui/TAPAALGUI.java (+30/-83)
src/main/java/pipe/gui/TabComponent.java (+4/-3)
src/main/java/pipe/gui/canvas/Canvas.java (+1/-1)
src/main/java/pipe/gui/canvas/DrawingSurfaceImpl.java (+78/-172)
src/main/java/pipe/gui/canvas/Grid.java (+10/-25)
src/main/java/pipe/gui/canvas/PrototypeCanvas.java (+1/-1)
src/main/java/pipe/gui/canvas/SelectionManager.java (+78/-98)
src/main/java/pipe/gui/canvas/Zoomer.java (+7/-5)
src/main/java/pipe/gui/petrinet/Export.java (+96/-102)
src/main/java/pipe/gui/petrinet/PetriNetTab.java (+963/-1115)
src/main/java/pipe/gui/petrinet/action/EditAnnotationBackgroundAction.java (+2/-2)
src/main/java/pipe/gui/petrinet/action/EditAnnotationBorderAction.java (+4/-4)
src/main/java/pipe/gui/petrinet/action/EditNoteAction.java (+2/-2)
src/main/java/pipe/gui/petrinet/action/GuiAction.java (+1/-2)
src/main/java/pipe/gui/petrinet/action/ShowHideInfoAction.java (+2/-2)
src/main/java/pipe/gui/petrinet/action/SplitArcAction.java (+5/-5)
src/main/java/pipe/gui/petrinet/action/SplitArcPointAction.java (+4/-4)
src/main/java/pipe/gui/petrinet/action/ToggleArcPointAction.java (+4/-4)
src/main/java/pipe/gui/petrinet/animation/AnimationControlSidePanel.java (+24/-22)
src/main/java/pipe/gui/petrinet/animation/AnimationHistoryList.java (+11/-10)
src/main/java/pipe/gui/petrinet/animation/AnimationHistorySidePanel.java (+11/-7)
src/main/java/pipe/gui/petrinet/animation/AnimationSettingsDialog.java (+11/-9)
src/main/java/pipe/gui/petrinet/animation/Animator.java (+35/-33)
src/main/java/pipe/gui/petrinet/animation/EnabledTransitionsList.java (+12/-10)
src/main/java/pipe/gui/petrinet/animation/SimulationControl.java (+10/-11)
src/main/java/pipe/gui/petrinet/animation/SimulatorFocusTraversalPolicy.java (+21/-12)
src/main/java/pipe/gui/petrinet/dataLayer/DataLayer.java (+11/-33)
src/main/java/pipe/gui/petrinet/editor/AnnotationPanel.java (+2/-2)
src/main/java/pipe/gui/petrinet/editor/EditorFocusTraversalPolicy.java (+8/-6)
src/main/java/pipe/gui/petrinet/editor/GuardDialogue.java (+112/-92)
src/main/java/pipe/gui/petrinet/editor/PlaceEditorPanel.java (+715/-81)
src/main/java/pipe/gui/petrinet/editor/TAPNTransitionEditor.java (+61/-38)
src/main/java/pipe/gui/petrinet/graphicElements/AnnotationNote.java (+66/-51)
src/main/java/pipe/gui/petrinet/graphicElements/Arc.java (+56/-22)
src/main/java/pipe/gui/petrinet/graphicElements/ArcPath.java (+18/-15)
src/main/java/pipe/gui/petrinet/graphicElements/ArcPathPoint.java (+60/-20)
src/main/java/pipe/gui/petrinet/graphicElements/Drawable.java (+1/-1)
src/main/java/pipe/gui/petrinet/graphicElements/GraphicalElement.java (+1/-17)
src/main/java/pipe/gui/petrinet/graphicElements/NameLabel.java (+8/-9)
src/main/java/pipe/gui/petrinet/graphicElements/Note.java (+26/-30)
src/main/java/pipe/gui/petrinet/graphicElements/PetriNetObject.java (+37/-79)
src/main/java/pipe/gui/petrinet/graphicElements/PetriNetObjectWithLabel.java (+9/-9)
src/main/java/pipe/gui/petrinet/graphicElements/Place.java (+38/-19)
src/main/java/pipe/gui/petrinet/graphicElements/PlaceTransitionObject.java (+38/-7)
src/main/java/pipe/gui/petrinet/graphicElements/Transition.java (+45/-22)
src/main/java/pipe/gui/petrinet/graphicElements/Translatable.java (+1/-1)
src/main/java/pipe/gui/petrinet/graphicElements/Zoomable.java (+1/-1)
src/main/java/pipe/gui/petrinet/graphicElements/tapn/TimedInhibitorArcComponent.java (+36/-32)
src/main/java/pipe/gui/petrinet/graphicElements/tapn/TimedInputArcComponent.java (+54/-27)
src/main/java/pipe/gui/petrinet/graphicElements/tapn/TimedOutputArcComponent.java (+54/-34)
src/main/java/pipe/gui/petrinet/graphicElements/tapn/TimedPlaceComponent.java (+379/-285)
src/main/java/pipe/gui/petrinet/graphicElements/tapn/TimedTransitionComponent.java (+99/-37)
src/main/java/pipe/gui/petrinet/graphicElements/tapn/TimedTransportArcComponent.java (+106/-83)
src/main/java/pipe/gui/petrinet/handler/LabelHandler.java (+10/-10)
src/main/java/pipe/gui/petrinet/undo/AddAnnotationNoteCommand.java (+4/-4)
src/main/java/pipe/gui/petrinet/undo/AddArcPathPointEditCommand.java (+8/-8)
src/main/java/pipe/gui/petrinet/undo/AnnotationBorderEditCommand.java (+5/-5)
src/main/java/pipe/gui/petrinet/undo/AnnotationTextEditCommand.java (+6/-6)
src/main/java/pipe/gui/petrinet/undo/ArcPathPointTypeEditCommand.java (+5/-5)
src/main/java/pipe/gui/petrinet/undo/ArcTimeIntervalEditCommand.java (+6/-6)
src/main/java/pipe/gui/petrinet/undo/CompundCommand.java (+29/-0)
src/main/java/pipe/gui/petrinet/undo/DeleteAnnotationNoteCommand.java (+4/-4)
src/main/java/pipe/gui/petrinet/undo/DeleteArcPathPointEditCommand.java (+11/-11)
src/main/java/pipe/gui/petrinet/undo/TAPNElementCommand.java (+3/-3)
src/main/java/pipe/gui/petrinet/undo/TransitionRotationEditCommand.java (+5/-5)
src/main/java/pipe/gui/petrinet/undo/TranslatePetriNetObjectEditCommand.java (+6/-6)
src/main/java/pipe/gui/petrinet/undo/UndoManager.java (+16/-11)
src/main/java/pipe/gui/swingcomponents/EscapableDialog.java (+49/-0)
src/main/java/pipe/gui/swingcomponents/WidthAdjustingComboBox.java (+60/-0)
src/main/java/pipe/gui/swingcomponents/filebrowser/FileBrowser.java (+187/-0)
src/main/javacc/dk/aau/cs/TCTL/Parsing/TAPAALQueryParser.jj (+6/-6)
src/main/javacc/dk/aau/cs/model/CPN/ArcExpressionParser/ArcExpressionParser.jj (+273/-0)
src/main/javacc/dk/aau/cs/model/CPN/GuardExpressionParser/GuardExpressionParser.jj (+223/-0)
src/main/resources/Example nets/ERK.tapn (+1/-1)
src/main/resources/Example nets/alternating-bit-protocol-components.tapn (+1/-1)
src/main/resources/Example nets/alternating-bit-protocol-transport.tapn (+1/-1)
src/main/resources/Example nets/alternating-bit-protocol.tapn (+1/-1)
src/main/resources/Example nets/cpn-packet.tapn (+351/-0)
src/main/resources/Example nets/fischer-protocol.tapn (+1/-1)
src/main/resources/Example nets/game-harddisk.tapn (+1/-1)
src/main/resources/Example nets/home-construction.tapn (+1/-1)
src/main/resources/Example nets/intro-example.tapn (+2/-2)
src/main/resources/Example nets/package-delivery.tapn (+1/-1)
src/main/resources/Example nets/philosophers.tapn (+539/-0)
src/main/resources/Example nets/producer-consumer.tapn (+1/-1)
src/main/resources/Example nets/referendum-colored.tapn (+285/-0)
src/main/resources/Example nets/referendum-timed-colored.tapn (+223/-0)
src/main/resources/Example nets/shortest-path.tapn (+1/-1)
src/main/resources/Example nets/token-ring.tapn (+437/-0)
src/main/resources/Example nets/train-level-crossing.tapn (+1/-1)
src/main/resources/Example nets/two-phase-locking.tapn (+1/-1)
src/main/resources/Example nets/untimedGame.tapn (+1/-1)
src/main/resources/Example nets/webserver.tapn (+1/-1)
src/main/resources/Example nets/workflow-advanced.tapn (+1/-1)
src/main/resources/Example nets/workflow-complaint.tapn (+1/-1)
src/main/resources/Example nets/workflow-medical.tapn (+1/-1)
src/main/resources/Example nets/workflow-payment.tapn (+1/-1)
src/main/resources/Example nets/workflow-simple.tapn (+1/-1)
src/pipe/gui/handler/AnnotationNoteHandler.java (+0/-56)
src/pipe/gui/handler/ArcHandler.java (+0/-77)
src/pipe/gui/handler/ArcPathPointHandler.java (+0/-95)
src/pipe/gui/handler/NoteHandler.java (+0/-13)
src/pipe/gui/handler/PetriNetObjectHandler.java (+0/-168)
src/pipe/gui/handler/PlaceHandler.java (+0/-45)
src/pipe/gui/handler/PlaceTransitionObjectHandler.java (+0/-57)
src/pipe/gui/handler/TimedArcHandler.java (+0/-31)
src/pipe/gui/handler/TransitionHandler.java (+0/-44)
src/pipe/gui/undo/TimedPlaceInvariantEdit.java (+0/-33)
src/pipe/gui/widgets/EscapableDialog.java (+0/-49)
src/pipe/gui/widgets/filebrowser/FileBrowser.java (+0/-53)
src/pipe/gui/widgets/filebrowser/NativeFileBrowser.java (+0/-178)
src/pipe/gui/widgets/filebrowser/NativeFileBrowserFallback.java (+0/-191)
src/test/java/dk/aau/cs/io/TapnXmlLoaderTest.kt (+1/-1)
src/test/java/dk/aau/cs/model/tapn/LocalTimedPlaceTest.kt (+107/-0)
To merge this branch: bzr merge lp:~tapaal-contributor/tapaal/cpn-gui-dev
Reviewer Review Type Date Requested Status
Peter Haahr Taankvist Pending
Jiri Srba Pending
Thomas Pedersen Pending
Review via email: mp+417125@code.launchpad.net

This proposal supersedes a proposal from 2021-06-15.

Commit message

Proposal of complete colored GUI including: Colortypes, variables, arc expression and colored arc intervals menu, guard expression menu, place and colored invariant menu, verification of colored nets and unfolding of colored nets.

To use all the features described in: https://docs.google.com/document/d/1SdUufTr0giizD-ZJ7BH0rcke-QQ-tp2MXfqb4c18sV8/edit

you will need verifydtapn with colors: https://github.com/TAPAAL-Developers/verifydtapn/tree/unfoldColor (PR: https://github.com/TAPAAL/verifydtapn/pull/10)
(Org branched from https://github.com/PeterHaahrTaankvist/verifydtapn/tree/unfolding_library)

and verifypn with colors: https://code.launchpad.net/~tapaal-contributor/verifypn/update-parser

To post a comment you must log in.
Revision history for this message
Kenneth Yrke Jørgensen (yrke) wrote : Posted in a previous version of this proposal

All code only comments should be removed, unless it directly relates to something being explained.
Or if used for specialized debug. If for debug, please mark the beginning of block with DEBUG.

Internal members not mutated should be marked final.

(I will make a patch that fixes these to issues)

Revision history for this message
Kenneth Yrke Jørgensen (yrke) wrote : Posted in a previous version of this proposal

File: ColoredArcGuardPanel.java
Function deleteSelections(), line 752

This "if" seems to have an flow error:

if (currentSelection.getObject() instanceof ArcExpression) {
    replacement = getSpecificChildOfProperty(1, currentSelection.getObject());
}
else if (currentSelection.getObject() instanceof ArcExpression) {
    replacement = new PlaceHolderColorExpression();
}

Second branch can't be reached, as it has the same guad as first branch. This must be a logical error.

Revision history for this message
Kenneth Yrke Jørgensen (yrke) wrote (last edit ): Posted in a previous version of this proposal

I noticed there seem to be a lot of TODO comments related to how colors should be handled.
I guess theses should all be adresse and can be removed safely?

If we leave in TODO comments for stuff that is already implemented or adresse elsewhere it can lead to confusion when we later revisit the code, as it might not be clear that the TODO comment is handled.

Intellij has a feature to list all todo/fixme etc. If there really is a todo, please add details about what is missing.

Revision history for this message
Kenneth Yrke Jørgensen (yrke) wrote : Posted in a previous version of this proposal

It seems some shortcuts are updated, please remember to update documentation: https://github.com/TAPAAL/TAPAAL/wiki/Shortcut-keys

Revision history for this message
Kenneth Yrke Jørgensen (yrke) wrote : Posted in a previous version of this proposal

I added a few more test to test out the api for new colors. I found a few problems in the interal consistency. Could you please have a look at this.

1625. By Jiri Srba

added explanation which color type cannot be removed (in case of multiple color type removal)

1626. By Kenneth Yrke Jørgensen

Potential fix for issue #1964937

Allow filter to be blank for selecting executable files in linux and macos

1627. By Jiri Srba

merged in lp:~tapaal-contributor/tapaal/cpn-remove-add fixing the transition guard dialog

1628. By Kenneth Yrke Jørgensen

Fixed bug #1964937

Iteration over a list that would be removed in the step above (list are references)

1629. By Lena Ernstsen

Fixed arc guard dialog not being able to display product colors

1630. By Lena Ernstsen

Fixed tuple selection problem in transition guard dialog

1631. By Lena Ernstsen

Fixed infinite loop when updating the color of an arc expression

1632. By Kenneth Yrke Jørgensen

Moved src files to gradle java project structure

1633. By Kenneth Yrke Jørgensen

Fixed what seems to be a logical error in selecting exporter

1634. By Kenneth Yrke Jørgensen

Fixed an issue where A E quantifiers would not show trace

1635. By Kenneth Yrke Jørgensen

Code cleanup

1636. By Kenneth Yrke Jørgensen

Fix for issue 1968474 Keep query cat when unfolding

1637. By Kenneth Yrke Jørgensen

Fixes #1968473, wrong filter applied in engine selection menu on windows

1638. By Kenneth Yrke Jørgensen

Fixed #1971420 unfolding empty net leads to error

It seems the unfolder genreates a dummy query to not have a empty list,
that query uses to reference the first templates first place, (which might not exist eg. net empty).
Insted change the dummy query to be E<>true.

1639. By Kenneth Yrke Jørgensen

Workarround for #1971422, need to make a propper fix later

1640. By Kenneth Yrke Jørgensen

Fixed a possible NPE

1641. By Jiri Srba

merged in lp:~tapaal-contributor/tapaal/conjunction-button-fix fixing a problem with and/or buttons in query dialog

1642. By Jiri Srba

merged in lp:~tapaal-contributor/tapaal/fix-product-display-1971421 fixing product colors editing in transitions guards

1643. By Kenneth Yrke Jørgensen

Added null check

1644. By Kenneth Yrke Jørgensen

refixed #1940418 via workarround

1645. By Jiri Srba

merged with trunk (fixing copying of components with environemnatl transitions)

1646. By Jiri Srba

merged with trunk (fixing editing of LTL queries)

1647. By Kenneth Yrke Jørgensen

Fixed long line error messages

1648. By Kenneth Yrke Jørgensen

Fixed an issue where shared transiations was "added" double due to parent network being reused when flatting net

1649. By Kenneth Yrke Jørgensen

Upgraded project dependency, removed junit4

1650. By Kenneth Yrke Jørgensen

Added support for opening files by dragging then on the canvas

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'build.gradle'
--- build.gradle 2021-08-11 11:19:19 +0000
+++ build.gradle 2022-07-21 13:30:11 +0000
@@ -1,94 +1,70 @@
1plugins {1plugins {
2 id 'java'2 id 'java'
3 id 'application'3 id 'application'
4 id 'org.jetbrains.kotlin.jvm' version '1.3.71'4 id 'org.jetbrains.kotlin.jvm' version '1.6.10'
5 id 'org.jetbrains.kotlin.plugin.serialization' version '1.6.10'
5 id "ca.coglinc.javacc" version "2.4.0"6 id "ca.coglinc.javacc" version "2.4.0"
6}7}
78
8group 'net.tapaal'9group 'net.tapaal'
9version '4.0-SNAPSHOT'10version '4.0-SNAPSHOT'
1011
12var targetJavaVersion = JavaVersion.VERSION_11
13var targetKotlinVersion = "1.6"
11java {14java {
12 sourceCompatibility = JavaVersion.VERSION_1115 sourceCompatibility = targetJavaVersion
13 targetCompatibility = JavaVersion.VERSION_1116 targetCompatibility = targetJavaVersion
14}17}
18
19compileKotlin {
20 sourceCompatibility = targetJavaVersion
21 targetCompatibility = targetJavaVersion
22
23 kotlinOptions {
24 jvmTarget = targetJavaVersion
25 apiVersion = targetKotlinVersion
26 languageVersion = targetKotlinVersion
27 }
28}
29
30mainClassName = 'TAPAAL'
1531
16repositories {32repositories {
17 mavenCentral()33 mavenCentral()
18}34}
1935
20compileJavacc {
21 inputDirectory = file('src/')
22 //outputDirectory = file(project.buildDir.absolutePath + '/generated/javacc')
23}
24
25//Set the soruce and resource dir
26sourceSets {36sourceSets {
27 main {37 main {
28 java {38 java {
29 srcDirs = ['src/', compileJavacc.outputDirectory]39 srcDir compileJavacc.outputDirectory
30 exclude("resources/")
31 }
32 resources {
33 //Resources should be in folder called resources, so only add the resources folder
34 //adding srv/resources will places content of the folder in root of jar file
35 srcDirs = ['src/']
36 include("resources/")
37 }
38 test {
39 java {
40 srcDirs = ['tests/']
41 }
42 }40 }
43 }41 }
44}42}
4543
46mainClassName = 'TAPAAL'
47
48jar {44jar {
49 exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'45 exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'
5046
51 //Sets the main call for the Jar, you can double click to run the jar file47 //Sets the main call for the Jar, you can double click to run the jar file
52 manifest {48 manifest {
53 attributes 'Main-Class': 'TAPAAL'49 attributes (
50 'Main-Class': mainClassName
51 )
54 }52 }
55 //The following lines makes libs a part of the build jar file (standalone jar)53 //The following lines makes libs a part of the build jar file (standalone jar)
56 //from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }54 //from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
57}55}
5856
59dependencies {57dependencies {
60 implementation group: 'commons-cli', name: 'commons-cli', version: '1.4'58 implementation 'commons-cli:commons-cli:1.5.0'
61 implementation group: 'org.swinglabs.swingx', name: 'swingx-all', version: '1.6.5-1'59 implementation 'org.swinglabs.swingx:swingx-all:1.6.5-1'
62 implementation group: 'net.java.dev.jna', name: 'jna', version: '4.5.1'60 implementation 'net.java.dev.jna:jna:5.11.0'
63 implementation 'org.jetbrains:annotations:16.0.2'61 implementation 'org.jetbrains:annotations:23.0.0'
64 //compile group: 'com.apple', name: 'AppleJavaExtensions', version: '1.4' // Not working62 implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.3'
6563
66 //Add jars from libs dir64 testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
67 implementation fileTree(dir: 'libs', include: ['*.jar'])65 testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
68
69 //Junit
70 testImplementation(
71 'org.junit.jupiter:junit-jupiter-api:5.4.2'
72 )
73 testRuntimeOnly(
74 'org.junit.jupiter:junit-jupiter-engine:5.4.2',
75 'org.junit.vintage:junit-vintage-engine:5.4.2'
76 )
77 implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
78}66}
67
79test {68test {
80 useJUnitPlatform()69 useJUnitPlatform()
81 afterTest { desc, result ->
82 logger.quiet "Executing test ${desc.name} [${desc.className}] with result: ${result.resultType}"
83 }
84}
85compileKotlin {
86 kotlinOptions {
87 jvmTarget = JavaVersion.VERSION_11
88 }
89}
90compileTestKotlin {
91 kotlinOptions {
92 jvmTarget = JavaVersion.VERSION_11
93 }
94}70}
9571
=== modified file 'gradle/wrapper/gradle-wrapper.jar'
96Binary files gradle/wrapper/gradle-wrapper.jar and gradle/wrapper/gradle-wrapper.jar differ72Binary files gradle/wrapper/gradle-wrapper.jar and gradle/wrapper/gradle-wrapper.jar differ
=== modified file 'gradle/wrapper/gradle-wrapper.properties'
--- gradle/wrapper/gradle-wrapper.properties 2020-04-06 12:41:08 +0000
+++ gradle/wrapper/gradle-wrapper.properties 2022-07-21 13:30:11 +0000
@@ -1,6 +1,5 @@
1#Mon Apr 06 14:40:09 CEST 20201distributionBase=GRADLE_USER_HOME
2distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip2distributionPath=wrapper/dists
3distributionBase=GRADLE_USER_HOME3distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
4distributionPath=wrapper/dists4zipStoreBase=GRADLE_USER_HOME
5zipStorePath=wrapper/dists5zipStorePath=wrapper/dists
6zipStoreBase=GRADLE_USER_HOME
76
=== modified file 'gradlew'
--- gradlew 2020-09-01 08:14:52 +0000
+++ gradlew 2022-07-21 13:30:11 +0000
@@ -82,6 +82,7 @@
8282
83CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar83CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
8484
85
85# Determine the Java command to use to start the JVM.86# Determine the Java command to use to start the JVM.
86if [ -n "$JAVA_HOME" ] ; then87if [ -n "$JAVA_HOME" ] ; then
87 if [ -x "$JAVA_HOME/jre/sh/java" ] ; then88 if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
@@ -129,6 +130,7 @@
129if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then130if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
130 APP_HOME=`cygpath --path --mixed "$APP_HOME"`131 APP_HOME=`cygpath --path --mixed "$APP_HOME"`
131 CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`132 CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
133
132 JAVACMD=`cygpath --unix "$JAVACMD"`134 JAVACMD=`cygpath --unix "$JAVACMD"`
133135
134 # We build the pattern for arguments to be converted via cygpath136 # We build the pattern for arguments to be converted via cygpath
135137
=== modified file 'gradlew.bat'
--- gradlew.bat 2020-03-28 10:29:30 +0000
+++ gradlew.bat 2022-07-21 13:30:11 +0000
@@ -40,7 +40,7 @@
4040
41set JAVA_EXE=java.exe41set JAVA_EXE=java.exe
42%JAVA_EXE% -version >NUL 2>&142%JAVA_EXE% -version >NUL 2>&1
43if "%ERRORLEVEL%" == "0" goto init43if "%ERRORLEVEL%" == "0" goto execute
4444
45echo.45echo.
46echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.46echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -54,7 +54,7 @@
54set JAVA_HOME=%JAVA_HOME:"=%54set JAVA_HOME=%JAVA_HOME:"=%
55set JAVA_EXE=%JAVA_HOME%/bin/java.exe55set JAVA_EXE=%JAVA_HOME%/bin/java.exe
5656
57if exist "%JAVA_EXE%" goto init57if exist "%JAVA_EXE%" goto execute
5858
59echo.59echo.
60echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%60echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -64,28 +64,14 @@
6464
65goto fail65goto fail
6666
67:init
68@rem Get command-line arguments, handling Windows variants
69
70if not "%OS%" == "Windows_NT" goto win9xME_args
71
72:win9xME_args
73@rem Slurp the command line arguments.
74set CMD_LINE_ARGS=
75set _SKIP=2
76
77:win9xME_args_slurp
78if "x%~1" == "x" goto execute
79
80set CMD_LINE_ARGS=%*
81
82:execute67:execute
83@rem Setup the command line68@rem Setup the command line
8469
85set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar70set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
8671
72
87@rem Execute Gradle73@rem Execute Gradle
88"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%74"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
8975
90:end76:end
91@rem End local scope for the variables with windows NT shell77@rem End local scope for the variables with windows NT shell
9278
=== removed directory 'src/dk/aau/cs/gui'
=== removed directory 'src/dk/aau/cs/gui/components'
=== removed directory 'src/dk/aau/cs/gui/components/handlers'
=== removed directory 'src/dk/aau/cs/gui/smartDraw'
=== removed directory 'src/dk/aau/cs/gui/undo'
=== removed file 'src/dk/aau/cs/util/ExecutabilityChecker.java'
--- src/dk/aau/cs/util/ExecutabilityChecker.java 2016-03-16 18:05:19 +0000
+++ src/dk/aau/cs/util/ExecutabilityChecker.java 1970-01-01 00:00:00 +0000
@@ -1,42 +0,0 @@
1package dk.aau.cs.util;
2
3import java.io.BufferedReader;
4import java.io.InputStream;
5import java.io.InputStreamReader;
6
7public class ExecutabilityChecker {
8 public static void check(String path) throws IllegalArgumentException{
9 int rcode = -1;
10 try {
11 Process p = Runtime.getRuntime().exec(new String[] { path, "-v" });
12
13 // Because some native platforms only provide limited buffer size
14 // for standard input and output streams, failure to promptly write
15 // the input stream or read the output stream of the subprocess may
16 // cause the subprocess to block, and even deadlock.
17
18 InputStream stream = p.getInputStream();
19 InputStreamReader isr = new InputStreamReader(stream);
20 BufferedReader br = new BufferedReader(isr);
21 while (br.readLine() != null){}
22
23 stream = p.getErrorStream();
24 isr = new InputStreamReader(stream);
25 br = new BufferedReader(isr);
26 while (br.readLine() != null){}
27
28 rcode = p.waitFor(); // Requires binary to accept -v flag
29 } catch (Exception e) {
30 // Do nothing
31 }
32 // Detect executable issues
33 switch(rcode){
34 case 0:
35 break;
36 case 126:
37 throw new IllegalArgumentException("The selected file is not executable on this system.");
38 default:
39 throw new IllegalArgumentException("The selected file is not executable or not compatible with your system (return value "+rcode+").");
40 }
41 }
42}
43\ No newline at end of file0\ No newline at end of file
441
=== added directory 'src/main'
=== added directory 'src/main/java'
=== renamed file 'src/TAPAAL.java' => 'src/main/java/TAPAAL.java'
=== renamed directory 'src/dk' => 'src/main/java/dk'
=== modified file 'src/main/java/dk/aau/cs/TCTL/AritmeticOperator.java'
--- src/dk/aau/cs/TCTL/AritmeticOperator.java 2020-11-06 19:41:50 +0000
+++ src/main/java/dk/aau/cs/TCTL/AritmeticOperator.java 2022-07-21 13:30:11 +0000
@@ -4,7 +4,7 @@
44
5public class AritmeticOperator extends TCTLAbstractStateProperty {5public class AritmeticOperator extends TCTLAbstractStateProperty {
6 6
7 String operator;7 final String operator;
8 8
9 public AritmeticOperator(String operator) {9 public AritmeticOperator(String operator) {
10 this.operator = operator;10 this.operator = operator;
1111
=== modified file 'src/main/java/dk/aau/cs/TCTL/LTLGNode.java'
--- src/dk/aau/cs/TCTL/LTLGNode.java 2021-10-08 06:26:14 +0000
+++ src/main/java/dk/aau/cs/TCTL/LTLGNode.java 2022-07-21 13:30:11 +0000
@@ -20,7 +20,7 @@
20 }20 }
2121
22 public LTLGNode() {22 public LTLGNode() {
23 this.property = new TCTLStatePlaceHolder();;23 this.property = new TCTLStatePlaceHolder();
24 this.property.setParent(this);24 this.property.setParent(this);
25 }25 }
2626
2727
=== modified file 'src/main/java/dk/aau/cs/TCTL/LTLUNode.java'
--- src/dk/aau/cs/TCTL/LTLUNode.java 2021-10-08 06:26:14 +0000
+++ src/main/java/dk/aau/cs/TCTL/LTLUNode.java 2022-07-21 13:30:11 +0000
@@ -54,7 +54,7 @@
54 StringPosition leftPos = new StringPosition(leftStart, leftEnd, left);54 StringPosition leftPos = new StringPosition(leftStart, leftEnd, left);
5555
56 int rightStart = right.isSimpleProperty() ? 0 : 1;56 int rightStart = right.isSimpleProperty() ? 0 : 1;
57 rightStart += leftEnd + 3 + + (left.isSimpleProperty() ? 0 : 1);57 rightStart += leftEnd + 3 + (left.isSimpleProperty() ? 0 : 1);
58 int rightEnd = rightStart + right.toString().length();58 int rightEnd = rightStart + right.toString().length();
59 StringPosition rightPos = new StringPosition(rightStart, rightEnd, right);59 StringPosition rightPos = new StringPosition(rightStart, rightEnd, right);
6060
6161
=== modified file 'src/main/java/dk/aau/cs/TCTL/StringPosition.java'
--- src/dk/aau/cs/TCTL/StringPosition.java 2011-02-03 19:03:15 +0000
+++ src/main/java/dk/aau/cs/TCTL/StringPosition.java 2022-07-21 13:30:11 +0000
@@ -4,10 +4,9 @@
44
5 private int startIndex;5 private int startIndex;
6 private int endIndex;6 private int endIndex;
7 private TCTLAbstractProperty object;7 private final TCTLAbstractProperty object;
88
9 public StringPosition(int startIndex, int endIndex,9 public StringPosition(int startIndex, int endIndex, TCTLAbstractProperty object) {
10 TCTLAbstractProperty object) {
11 this.startIndex = startIndex;10 this.startIndex = startIndex;
12 this.endIndex = endIndex;11 this.endIndex = endIndex;
13 this.object = object;12 this.object = object;
1413
=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLAUNode.java'
--- src/dk/aau/cs/TCTL/TCTLAUNode.java 2020-11-06 19:41:50 +0000
+++ src/main/java/dk/aau/cs/TCTL/TCTLAUNode.java 2022-07-21 13:30:11 +0000
@@ -50,7 +50,7 @@
50 StringPosition leftPos = new StringPosition(leftStart, leftEnd, left);50 StringPosition leftPos = new StringPosition(leftStart, leftEnd, left);
51 51
52 int rightStart = right.isSimpleProperty() ? 0 : 1;52 int rightStart = right.isSimpleProperty() ? 0 : 1;
53 rightStart += leftEnd + 3 + + (left.isSimpleProperty() ? 0 : 1);53 rightStart += leftEnd + 3 + (left.isSimpleProperty() ? 0 : 1);
54 int rightEnd = rightStart + right.toString().length();54 int rightEnd = rightStart + right.toString().length();
55 StringPosition rightPos = new StringPosition(rightStart, rightEnd, right);55 StringPosition rightPos = new StringPosition(rightStart, rightEnd, right);
5656
5757
=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLAbstractProperty.java'
--- src/dk/aau/cs/TCTL/TCTLAbstractProperty.java 2021-08-16 07:29:37 +0000
+++ src/main/java/dk/aau/cs/TCTL/TCTLAbstractProperty.java 2022-07-21 13:30:11 +0000
@@ -2,8 +2,6 @@
22
3import dk.aau.cs.TCTL.visitors.ITCTLVisitor;3import dk.aau.cs.TCTL.visitors.ITCTLVisitor;
44
5import java.util.Locale;
6
7public abstract class TCTLAbstractProperty {5public abstract class TCTLAbstractProperty {
86
9 // used to determine whether to put parenthesis around the property7 // used to determine whether to put parenthesis around the property
108
=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLAbstractStateProperty.java'
--- src/dk/aau/cs/TCTL/TCTLAbstractStateProperty.java 2011-02-03 19:03:15 +0000
+++ src/main/java/dk/aau/cs/TCTL/TCTLAbstractStateProperty.java 2022-07-21 13:30:11 +0000
@@ -18,18 +18,4 @@
1818
19 @Override19 @Override
20 public abstract TCTLAbstractStateProperty copy();20 public abstract TCTLAbstractStateProperty copy();
21
22 // public abstract void accept(ICSLVisitor visitor) throws
23 // ModelCheckingException;
24
25 // protected abstract void setCompositionality(boolean
26 // withinSteadyStateOperator);
27
28 // public void setCompositionality() {
29 // setCompositionality(false);
30 // }
31 //
32 // public boolean isCompositional() {
33 // return isCompositional;
34 // }
35}21}
3622
=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLAndListNode.java'
--- src/dk/aau/cs/TCTL/TCTLAndListNode.java 2020-11-06 19:41:50 +0000
+++ src/main/java/dk/aau/cs/TCTL/TCTLAndListNode.java 2022-07-21 13:30:11 +0000
@@ -77,8 +77,7 @@
77 s.append(" and ");77 s.append(" and ");
78 }78 }
7979
80 s.append(prop.isSimpleProperty() ? prop.toString() : "("80 s.append(prop.isSimpleProperty() ? prop.toString() : "(" + prop + ")");
81 + prop.toString() + ")");
82 firstTime = false;81 firstTime = false;
83 }82 }
8483
8584
=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLAtomicPropositionNode.java'
--- src/dk/aau/cs/TCTL/TCTLAtomicPropositionNode.java 2020-11-06 19:41:50 +0000
+++ src/main/java/dk/aau/cs/TCTL/TCTLAtomicPropositionNode.java 2022-07-21 13:30:11 +0000
@@ -94,31 +94,6 @@
94 return false;94 return false;
95 }95 }
9696
97/* @Override
98 public StringPosition[] getChildren() {
99 StringPosition[] children = new StringPosition[2];
100
101 int start = 0;
102 int end = 0;
103 boolean leftSimpleProperty = left.isSimpleProperty();
104
105 start = leftSimpleProperty ? 0 : 1;
106 end = start + left.toString().length();
107
108 StringPosition posLeft = new StringPosition(start, end, left);
109
110 start = end + 5 + (right.isSimpleProperty() ? 0 : 1)
111 + (leftSimpleProperty ? 0 : 1);
112
113 end = start + right.toString().length();
114
115 StringPosition posRight = new StringPosition(start, end, right);
116
117 children[0] = posLeft;
118 children[1] = posRight;
119 return children;
120 }*/
121
122 @Override97 @Override
123 public TCTLAbstractProperty findFirstPlaceHolder() {98 public TCTLAbstractProperty findFirstPlaceHolder() {
124 TCTLAbstractProperty rightP = right.findFirstPlaceHolder(); 99 TCTLAbstractProperty rightP = right.findFirstPlaceHolder();
125100
=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLConstNode.java'
--- src/dk/aau/cs/TCTL/TCTLConstNode.java 2020-11-06 19:41:50 +0000
+++ src/main/java/dk/aau/cs/TCTL/TCTLConstNode.java 2022-07-21 13:30:11 +0000
@@ -4,7 +4,7 @@
44
5public class TCTLConstNode extends TCTLAbstractStateProperty {5public class TCTLConstNode extends TCTLAbstractStateProperty {
66
7 int constant;7 final int constant;
88
9 public TCTLConstNode(int constant) {9 public TCTLConstNode(int constant) {
10 this.constant = constant;10 this.constant = constant;
1111
=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLEFNode.java'
--- src/dk/aau/cs/TCTL/TCTLEFNode.java 2021-09-14 20:13:01 +0000
+++ src/main/java/dk/aau/cs/TCTL/TCTLEFNode.java 2022-07-21 13:30:11 +0000
@@ -2,8 +2,6 @@
22
3import dk.aau.cs.TCTL.visitors.ITCTLVisitor;3import dk.aau.cs.TCTL.visitors.ITCTLVisitor;
44
5import java.util.HashMap;
6
7public class TCTLEFNode extends TCTLAbstractPathProperty {5public class TCTLEFNode extends TCTLAbstractPathProperty {
86
9 private TCTLAbstractStateProperty property;7 private TCTLAbstractStateProperty property;
108
=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLOrListNode.java'
--- src/dk/aau/cs/TCTL/TCTLOrListNode.java 2020-11-06 19:41:50 +0000
+++ src/main/java/dk/aau/cs/TCTL/TCTLOrListNode.java 2022-07-21 13:30:11 +0000
@@ -77,8 +77,7 @@
77 s.append(" or ");77 s.append(" or ");
78 }78 }
7979
80 s.append(prop.isSimpleProperty() ? prop.toString() : "("80 s.append(prop.isSimpleProperty() ? prop.toString() : "(" + prop + ")");
81 + prop.toString() + ")");
82 firstTime = false;81 firstTime = false;
83 }82 }
8483
8584
=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLPlusListNode.java'
--- src/dk/aau/cs/TCTL/TCTLPlusListNode.java 2020-11-06 19:41:50 +0000
+++ src/main/java/dk/aau/cs/TCTL/TCTLPlusListNode.java 2022-07-21 13:30:11 +0000
@@ -8,7 +8,7 @@
8//Represents a list of terms and the operators between then, these are all stored in the terms list8//Represents a list of terms and the operators between then, these are all stored in the terms list
9public class TCTLPlusListNode extends TCTLAbstractStateProperty {9public class TCTLPlusListNode extends TCTLAbstractStateProperty {
1010
11 ArrayList<TCTLAbstractStateProperty> terms;11 final ArrayList<TCTLAbstractStateProperty> terms;
12 12
13 public TCTLPlusListNode(ArrayList<TCTLAbstractStateProperty> terms) {13 public TCTLPlusListNode(ArrayList<TCTLAbstractStateProperty> terms) {
14 this.terms = terms;14 this.terms = terms;
1515
=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLTermListNode.java'
--- src/dk/aau/cs/TCTL/TCTLTermListNode.java 2020-11-06 19:41:50 +0000
+++ src/main/java/dk/aau/cs/TCTL/TCTLTermListNode.java 2022-07-21 13:30:11 +0000
@@ -8,7 +8,7 @@
8//Represents a list of factors and the operators between then, these are all stored in the factors list8//Represents a list of factors and the operators between then, these are all stored in the factors list
9public class TCTLTermListNode extends TCTLAbstractStateProperty {9public class TCTLTermListNode extends TCTLAbstractStateProperty {
1010
11 ArrayList<TCTLAbstractStateProperty> factors;11 final ArrayList<TCTLAbstractStateProperty> factors;
1212
13 public TCTLTermListNode(ArrayList<TCTLAbstractStateProperty> factors) {13 public TCTLTermListNode(ArrayList<TCTLAbstractStateProperty> factors) {
14 this.factors = factors;14 this.factors = factors;
1515
=== modified file 'src/main/java/dk/aau/cs/TCTL/XMLParsing/XMLCTLQueryParser.java'
--- src/dk/aau/cs/TCTL/XMLParsing/XMLCTLQueryParser.java 2017-05-14 19:42:09 +0000
+++ src/main/java/dk/aau/cs/TCTL/XMLParsing/XMLCTLQueryParser.java 2022-07-21 13:30:11 +0000
@@ -44,9 +44,9 @@
44 XMLCTLQueryParser parser = new XMLCTLQueryParser(prop, queryWrapper);44 XMLCTLQueryParser parser = new XMLCTLQueryParser(prop, queryWrapper);
45 queryWrapper.setName(parser.parsePropertyName());45 queryWrapper.setName(parser.parsePropertyName());
4646
47 try{47 try {
48 queryWrapper.setProp(parser.AbstractProperty());48 queryWrapper.setProp(parser.AbstractProperty());
49 } catch (XMLQueryParseException e){49 } catch (XMLQueryParseException e) {
50 queryWrapper.setException(e);50 queryWrapper.setException(e);
51 Logger.log(e);51 Logger.log(e);
52 return false;52 return false;
@@ -87,14 +87,14 @@
87 }87 }
8888
89 private TCTLAbstractProperty parseFormula(Node property)89 private TCTLAbstractProperty parseFormula(Node property)
90 throws XMLQueryParseException{90 throws XMLQueryParseException {
9191
92 TCTLAbstractProperty childProperty;92 TCTLAbstractProperty childProperty;
93 Node child = getFirstChildNode(property);93 Node child = getFirstChildNode(property);
94 String nodeName = property.getNodeName();94 String nodeName = property.getNodeName();
95 95
96 String childNodeName = "";96 String childNodeName = "";
97 if(child != null){97 if (child != null) {
98 childNodeName = child.getNodeName();98 childNodeName = child.getNodeName();
99 }99 }
100 100
@@ -366,38 +366,40 @@
366 } else if(nodeName.equals("integer-ge")){366 } else if(nodeName.equals("integer-ge")){
367 return new TCTLAtomicPropositionNode(subformula1, ">=", subformula2);367 return new TCTLAtomicPropositionNode(subformula1, ">=", subformula2);
368 }368 }
369 } else if (nodeName.equals("is-fireable")){369 } else if (nodeName.equals("is-fireable")) {
370 // Construct a nested disjunction of transitions.370 // Construct a nested disjunction of transitions.
371 371
372 children = getAllChildren(property);372 children = getAllChildren(property);
373373
374 if(children.isEmpty()){374 if (children.isEmpty()) {
375 throw new XMLQueryParseException(ERROR_MESSAGE + nodeName);375 throw new XMLQueryParseException(ERROR_MESSAGE + nodeName);
376 } else if(children.size() == 1) {376 } else if (children.size() == 1) {
377 String[] splits = getText(children.get(0)).replace("\n", "").split("\\.");377 String[] splits = getText(children.get(0)).replace("\n", "").split("\\.");
378 378
379 // Check if transition contains a template name379 // Check if transition contains a template name
380 if(splits.length > 1){380 if (splits.length > 1) {
381 return new TCTLTransitionNode(splits[0], splits[1]);381 return new TCTLTransitionNode(splits[0], splits[1]);
382 } else {382 } else {
383 return new TCTLTransitionNode(splits[0]);383 return new TCTLTransitionNode(splits[0]);
384 }384 }
385 } else {385 } else {
386 ArrayList<TCTLAbstractStateProperty> transitions = new ArrayList<TCTLAbstractStateProperty>();386 ArrayList<TCTLAbstractStateProperty> transitions = new ArrayList<TCTLAbstractStateProperty>();
387 387
388 for(Node n : children) {388 for (Node n : children) {
389 String[] splits = getText(n).replace("\n", "").split("\\.");389 String[] splits = getText(n).replace("\n", "").split("\\.");
390 390
391 // Check if transition contains a template name391 // Check if transition contains a template name
392 if(splits.length > 1){392 if (splits.length > 1) {
393 transitions.add(new TCTLTransitionNode(splits[0], splits[1]));393 transitions.add(new TCTLTransitionNode(splits[0], splits[1]));
394 } else {394 } else {
395 transitions.add(new TCTLTransitionNode(splits[0]));395 transitions.add(new TCTLTransitionNode(splits[0]));
396 }396 }
397 }397 }
398 return new TCTLOrListNode(transitions);398 return new TCTLOrListNode(transitions);
399 }399 }
400 } else{400 } else if (nodeName.equals("control")) {
401 return parseFormula(child);
402 }else{
401 parseFormula(property);403 parseFormula(property);
402 }404 }
403405
404406
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/AddTemplateVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/AddTemplateVisitor.java 2014-05-22 20:26:41 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/AddTemplateVisitor.java 2022-07-21 13:30:11 +0000
@@ -3,7 +3,7 @@
3import dk.aau.cs.TCTL.TCTLPlaceNode;3import dk.aau.cs.TCTL.TCTLPlaceNode;
44
5public class AddTemplateVisitor extends VisitorBase {5public class AddTemplateVisitor extends VisitorBase {
6 private String templateName;6 private final String templateName;
77
8 public AddTemplateVisitor(String templateName) {8 public AddTemplateVisitor(String templateName) {
9 this.templateName = templateName;9 this.templateName = templateName;
1010
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/BroadcastTranslationQueryVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/BroadcastTranslationQueryVisitor.java 2019-03-22 10:13:18 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/BroadcastTranslationQueryVisitor.java 2022-07-21 13:30:11 +0000
@@ -7,8 +7,8 @@
7 protected static final String PLOCK = "P_lock";7 protected static final String PLOCK = "P_lock";
8 protected static final String TOKEN_TEMPLATE_NAME = "Token";8 protected static final String TOKEN_TEMPLATE_NAME = "Token";
99
10 private boolean useSymmetry;10 private final boolean useSymmetry;
11 private int totalTokens;11 private final int totalTokens;
1212
13 public BroadcastTranslationQueryVisitor(boolean useSymmetry, int totalTokens) {13 public BroadcastTranslationQueryVisitor(boolean useSymmetry, int totalTokens) {
14 this.useSymmetry = useSymmetry;14 this.useSymmetry = useSymmetry;
1515
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/CTLQueryVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/CTLQueryVisitor.java 2021-10-08 06:22:05 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/CTLQueryVisitor.java 2022-07-21 13:30:11 +0000
@@ -1,271 +1,288 @@
1package dk.aau.cs.TCTL.visitors;1package dk.aau.cs.TCTL.visitors;
22
3import java.util.List;
4
5import dk.aau.cs.TCTL.*;3import dk.aau.cs.TCTL.*;
6import dk.aau.cs.io.XMLFormatter;4import dk.aau.cs.io.XMLFormatter;
75
6import java.util.List;
7
8public class CTLQueryVisitor extends VisitorBase {8public class CTLQueryVisitor extends VisitorBase {
9 9
10 private static final String XML_NS = "xmlns=\"http://tapaal.net/\"";10 private static final String XML_NS = "xmlns=\"http://tapaal.net/\"";
11 private static final String XML_PROPSET = "property-set";11 private static final String XML_PROPSET = "property-set";
12 private static final String XML_PROP = "property";12 private static final String XML_PROP = "property";
13 private static final String XML_PROPID = "id";13 private static final String XML_PROPID = "id";
14 private static final String XML_PROPDESC = "description";14 private static final String XML_PROPDESC = "description";
15 private static final String XML_FORMULA = "formula"; 15 private static final String XML_FORMULA = "formula";
16 private static final String XML_ALLPATHS = "all-paths";16 private static final String XML_ALLPATHS = "all-paths";
17 private static final String XML_EXISTSPATH = "exists-path";17 private static final String XML_EXISTSPATH = "exists-path";
18 private static final String XML_NEGATION = "negation";18 private static final String XML_NEGATION = "negation";
19 private static final String XML_CONJUNCTION = "conjunction";19 private static final String XML_CONJUNCTION = "conjunction";
20 private static final String XML_DISJUNCTION = "disjunction";20 private static final String XML_DISJUNCTION = "disjunction";
21 private static final String XML_GLOBALLY = "globally";21 private static final String XML_GLOBALLY = "globally";
22 private static final String XML_FINALLY = "finally";22 private static final String XML_FINALLY = "finally";
23 private static final String XML_NEXT = "next";23 private static final String XML_NEXT = "next";
24 private static final String XML_UNTIL = "until";24 private static final String XML_UNTIL = "until";
25 private static final String XML_BEFORE = "before";25 private static final String XML_BEFORE = "before";
26 private static final String XML_REACH = "reach";26 private static final String XML_REACH = "reach";
27 private static final String XML_DEADLOCK = "deadlock";27 private static final String XML_DEADLOCK = "deadlock";
28 private static final String XML_TRUE = "true";28 private static final String XML_TRUE = "true";
29 private static final String XML_FALSE = "false";29 private static final String XML_FALSE = "false";
30 private static final String XML_INTEGERLT = "integer-lt";30 private static final String XML_INTEGERLT = "integer-lt";
31 private static final String XML_INTEGERLE = "integer-le";31 private static final String XML_INTEGERLE = "integer-le";
32 private static final String XML_INTEGEREQ = "integer-eq";32 private static final String XML_INTEGEREQ = "integer-eq";
33 private static final String XML_INTEGERNE = "integer-ne";33 private static final String XML_INTEGERNE = "integer-ne";
34 private static final String XML_INTEGERGT = "integer-gt";34 private static final String XML_INTEGERGT = "integer-gt";
35 private static final String XML_INTEGERGE = "integer-ge";35 private static final String XML_INTEGERGE = "integer-ge";
36 private static final String XML_ISFIREABLE = "is-fireable";36 private static final String XML_ISFIREABLE = "is-fireable";
37 private static final String XML_INTEGERCONSTANT = "integer-constant";37 private static final String XML_INTEGERCONSTANT = "integer-constant";
38 private static final String XML_TOKENSCOUNT = "tokens-count";38 private static final String XML_TOKENSCOUNT = "tokens-count";
39 private static final String XML_PLACE = "place";39 private static final String XML_PLACE = "place";
40 private static final String XML_TRANSITION = "transition";40 private static final String XML_TRANSITION = "transition";
41 private static final String XML_INTEGERSUM = "integer-sum";41 private static final String XML_INTEGERSUM = "integer-sum";
42 private static final String XML_INTEGERPRODUCT = "integer-product";42 private static final String XML_INTEGERPRODUCT = "integer-product";
43 private static final String XML_INTEGERDIFFERENCE = "integer-difference";43 private static final String XML_INTEGERDIFFERENCE = "integer-difference";
4444 private static final String CONTROL = "control";
45 private StringBuffer XMLQuery;45
46 46 private final StringBuffer xmlQuery = new StringBuffer();
47 public CTLQueryVisitor() {47
48 this.XMLQuery = new StringBuffer();48 public CTLQueryVisitor() {
49 }49 super();
50 50 }
51 public String getXMLQueryFor(TCTLAbstractProperty property, String queryName) {51
52 buildXMLQuery(property, queryName);52 public String getXMLQueryFor(TCTLAbstractProperty property, String queryName, boolean control) {
53 return getFormatted();53 buildXMLQuery(property, queryName, control);
54 }54 return getFormatted();
55 55 }
56 public void buildXMLQuery(TCTLAbstractProperty property, String queryName) {56
57 XMLQuery.append(startTag(XML_PROP) + queryInfo(queryName) + startTag(XML_FORMULA));57 public void buildXMLQuery(TCTLAbstractProperty property, String queryName, boolean control) {
58 property.accept(this, null);58 xmlQuery.append(startTag(XML_PROP) + queryInfo(queryName) + startTag(XML_FORMULA));
59 XMLQuery.append(endTag(XML_FORMULA) + endTag(XML_PROP)); 59 if (control) xmlQuery.append(startTag(CONTROL));
60 }60 property.accept(this, null);
61 61 if (control) xmlQuery.append(endTag(CONTROL));
62 public String getFormatted() {62 xmlQuery.append(endTag(XML_FORMULA) + endTag(XML_PROP));
63 XMLFormatter formatter = new XMLFormatter();63 }
64 return formatter.format(getStartTag() + XMLQuery.toString() + getEndTag());64
65 }65 public String getFormatted() {
6666 XMLFormatter formatter = new XMLFormatter();
67 public StringBuffer getXMLQuery() {67 return formatter.format(getStartTag() + xmlQuery.toString() + getEndTag());
68 return XMLQuery;68 }
69 }69
70 70 public StringBuffer getXMLQuery() {
71 public String getStartTag(){71 return xmlQuery;
72 return startTag(XML_PROPSET + " " + XML_NS) + "\n";72 }
73 }73
74 74 public String getStartTag() {
75 public String getEndTag(){75 return startTag(XML_PROPSET + " " + XML_NS) + "\n";
76 return endTag(XML_PROPSET) + "\n";76 }
77 }77
78 78 public String getEndTag() {
79 private String queryInfo(String queryName){79 return endTag(XML_PROPSET) + "\n";
80 String nameToPrint = (queryName == null) ? "Query Comment/Name Here" : queryName;80 }
81 return wrapInTag(nameToPrint, XML_PROPID) + wrapInTag(nameToPrint, XML_PROPDESC);81
82 }82 private String queryInfo(String queryName) {
83 83 String nameToPrint = (queryName == null) ? "Query Comment/Name Here" : queryName;
84 public void visit(TCTLAFNode afNode, Object context) {84 return wrapInTag(nameToPrint, XML_PROPID) + wrapInTag(nameToPrint, XML_PROPDESC);
85 XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_FINALLY));85 }
86 afNode.getProperty().accept(this, context);86
87 XMLQuery.append(endTag(XML_FINALLY) + endTag(XML_ALLPATHS));87 public void visit(TCTLAFNode afNode, Object context) {
88 }88 xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_FINALLY));
8989 afNode.getProperty().accept(this, context);
90 public void visit(TCTLAGNode agNode, Object context) {90 xmlQuery.append(endTag(XML_FINALLY) + endTag(XML_ALLPATHS));
91 XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_GLOBALLY));91 }
92 agNode.getProperty().accept(this, context);92
93 XMLQuery.append(endTag(XML_GLOBALLY) + endTag(XML_ALLPATHS));93 public void visit(TCTLAGNode agNode, Object context) {
94 }94 xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_GLOBALLY));
95 95 agNode.getProperty().accept(this, context);
96 public void visit(TCTLAXNode axNode, Object context) {96 xmlQuery.append(endTag(XML_GLOBALLY) + endTag(XML_ALLPATHS));
97 XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_NEXT));97 }
98 axNode.getProperty().accept(this, context);98
99 XMLQuery.append(endTag(XML_NEXT) + endTag(XML_ALLPATHS));99 public void visit(TCTLAXNode axNode, Object context) {
100 }100 xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_NEXT));
101 101 axNode.getProperty().accept(this, context);
102 public void visit(TCTLAUNode auNode, Object context) {102 xmlQuery.append(endTag(XML_NEXT) + endTag(XML_ALLPATHS));
103 XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_UNTIL) + startTag(XML_BEFORE));103 }
104 auNode.getLeft().accept(this, context);104
105 XMLQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));105 public void visit(TCTLAUNode auNode, Object context) {
106 auNode.getRight().accept(this, context);106 xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_UNTIL) + startTag(XML_BEFORE));
107 XMLQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_ALLPATHS));107 auNode.getLeft().accept(this, context);
108 }108 xmlQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
109109 auNode.getRight().accept(this, context);
110 public void visit(TCTLEFNode efNode, Object context) {110 xmlQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_ALLPATHS));
111 XMLQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_FINALLY));111 }
112 efNode.getProperty().accept(this, context);112
113 XMLQuery.append(endTag(XML_FINALLY) + endTag(XML_EXISTSPATH));113 public void visit(TCTLEFNode efNode, Object context) {
114 }114 xmlQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_FINALLY));
115115 efNode.getProperty().accept(this, context);
116 public void visit(TCTLEGNode egNode, Object context) {116 xmlQuery.append(endTag(XML_FINALLY) + endTag(XML_EXISTSPATH));
117 XMLQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_GLOBALLY));117 }
118 egNode.getProperty().accept(this, context);118
119 XMLQuery.append(endTag(XML_GLOBALLY) + endTag(XML_EXISTSPATH));119 public void visit(TCTLEGNode egNode, Object context) {
120 }120 xmlQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_GLOBALLY));
121 121 egNode.getProperty().accept(this, context);
122 public void visit(TCTLEXNode exNode, Object context) {122 xmlQuery.append(endTag(XML_GLOBALLY) + endTag(XML_EXISTSPATH));
123 XMLQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_NEXT));123 }
124 exNode.getProperty().accept(this, context);124
125 XMLQuery.append(endTag(XML_NEXT) + endTag(XML_EXISTSPATH));125 public void visit(TCTLEXNode exNode, Object context) {
126 }126 xmlQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_NEXT));
127 127 exNode.getProperty().accept(this, context);
128 public void visit(TCTLEUNode euNode, Object context) {128 xmlQuery.append(endTag(XML_NEXT) + endTag(XML_EXISTSPATH));
129 XMLQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_UNTIL) + startTag(XML_BEFORE));129 }
130 euNode.getLeft().accept(this, context);130
131 XMLQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));131 public void visit(TCTLEUNode euNode, Object context) {
132 euNode.getRight().accept(this, context);132 xmlQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_UNTIL) + startTag(XML_BEFORE));
133 XMLQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_EXISTSPATH));133 euNode.getLeft().accept(this, context);
134 }134 xmlQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
135 euNode.getRight().accept(this, context);
136 xmlQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_EXISTSPATH));
137 }
135138
136 public void visit(LTLFNode afNode, Object context) {139 public void visit(LTLFNode afNode, Object context) {
137 XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_FINALLY));140 xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_FINALLY));
138 afNode.getProperty().accept(this, context);141 afNode.getProperty().accept(this, context);
139 XMLQuery.append(endTag(XML_FINALLY) + endTag(XML_ALLPATHS));142 xmlQuery.append(endTag(XML_FINALLY) + endTag(XML_ALLPATHS));
140 }143 }
141144
142 public void visit(LTLGNode agNode, Object context) {145 public void visit(LTLGNode agNode, Object context) {
143 XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_GLOBALLY));146 xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_GLOBALLY));
144 agNode.getProperty().accept(this, context);147 agNode.getProperty().accept(this, context);
145 XMLQuery.append(endTag(XML_GLOBALLY) + endTag(XML_ALLPATHS));148 xmlQuery.append(endTag(XML_GLOBALLY) + endTag(XML_ALLPATHS));
146 }149 }
147150
148 public void visit(LTLXNode axNode, Object context) {151 public void visit(LTLXNode axNode, Object context) {
149 XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_NEXT));152 xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_NEXT));
150 axNode.getProperty().accept(this, context);153 axNode.getProperty().accept(this, context);
151 XMLQuery.append(endTag(XML_NEXT) + endTag(XML_ALLPATHS));154 xmlQuery.append(endTag(XML_NEXT) + endTag(XML_ALLPATHS));
152 }155 }
153156
154 public void visit(LTLUNode auNode, Object context) {157 public void visit(LTLUNode auNode, Object context) {
155 XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_UNTIL) + startTag(XML_BEFORE));158 xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_UNTIL) + startTag(XML_BEFORE));
156 auNode.getLeft().accept(this, context);159 auNode.getLeft().accept(this, context);
157 XMLQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));160 xmlQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
158 auNode.getRight().accept(this, context);161 auNode.getRight().accept(this, context);
159 XMLQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_ALLPATHS));162 xmlQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_ALLPATHS));
160 }163 }
161 164
162 public void visit(TCTLPathToStateConverter pathConverter, Object context) {165 public void visit(TCTLPathToStateConverter pathConverter, Object context) {
163 pathConverter.getProperty().accept(this, context);166 pathConverter.getProperty().accept(this, context);
164 }167 }
165168
166 public void visit(TCTLAndListNode andListNode, Object context) {169 public void visit(TCTLAndListNode andListNode, Object context) {
167 createList(andListNode.getProperties(), context, XML_CONJUNCTION);170 createList(andListNode.getProperties(), context, XML_CONJUNCTION);
168 }171 }
169 172
170 public void visit(TCTLOrListNode orListNode, Object context) {173 public void visit(TCTLOrListNode orListNode, Object context) {
171 createList(orListNode.getProperties(), context, XML_DISJUNCTION);174 createList(orListNode.getProperties(), context, XML_DISJUNCTION);
172 }175 }
173176
174 public void visit(TCTLTermListNode termListNode, Object context) {177 public void visit(TCTLTermListNode termListNode, Object context) {
175 assert termListNode.getProperties().get(1) instanceof AritmeticOperator;178 assert termListNode.getProperties().get(1) instanceof AritmeticOperator;
176 AritmeticOperator operator = (AritmeticOperator)termListNode.getProperties().get(1);179 AritmeticOperator operator = (AritmeticOperator) termListNode.getProperties().get(1);
177 String op = operator.toString();180 String op = operator.toString();
178 if (op.equals("+")) {181 switch (op) {
179 createList(termListNode.getProperties(), context, XML_INTEGERSUM);182 case "+":
180 } else if (op.equals("*")) {183 createList(termListNode.getProperties(), context, XML_INTEGERSUM);
181 createList(termListNode.getProperties(), context, XML_INTEGERPRODUCT);184 break;
182 } else if (op.equals("-")) {185 case "*":
183 createList(termListNode.getProperties(), context, XML_INTEGERDIFFERENCE);186 createList(termListNode.getProperties(), context, XML_INTEGERPRODUCT);
184 }187 break;
185 }188 case "-":
186189 createList(termListNode.getProperties(), context, XML_INTEGERDIFFERENCE);
187 private void createList(List<TCTLAbstractStateProperty> properties, Object context, String seperator) {190 break;
188 XMLQuery.append(startTag(seperator));191 }
189192 }
190 for (TCTLAbstractStateProperty p : properties) {193
191 p.accept(this, context);194 private void createList(List<TCTLAbstractStateProperty> properties, Object context, String seperator) {
192 }195 xmlQuery.append(startTag(seperator));
193196
194 XMLQuery.append(endTag(seperator));197 for (TCTLAbstractStateProperty p : properties) {
195 }198 p.accept(this, context);
196199 }
197 public void visit(TCTLNotNode notNode, Object context) {200
198 XMLQuery.append(startTag(XML_NEGATION));201 xmlQuery.append(endTag(seperator));
199 notNode.getProperty().accept(this, context);202 }
200 XMLQuery.append(endTag(XML_NEGATION));203
201 }204 public void visit(TCTLNotNode notNode, Object context) {
202 205 xmlQuery.append(startTag(XML_NEGATION));
203 public void visit(TCTLTrueNode tctlTrueNode, Object context) { 206 notNode.getProperty().accept(this, context);
204 XMLQuery.append(emptyElement(XML_TRUE));207 xmlQuery.append(endTag(XML_NEGATION));
205 }208 }
206 209
207 public void visit(TCTLFalseNode tctlFalseNode, Object context) {210 public void visit(TCTLTrueNode tctlTrueNode, Object context) {
208 XMLQuery.append(emptyElement(XML_FALSE));211 xmlQuery.append(emptyElement(XML_TRUE));
209 }212 }
210 213
211 public void visit(TCTLDeadlockNode tctlDeadLockNode, Object context) {214 public void visit(TCTLFalseNode tctlFalseNode, Object context) {
212 XMLQuery.append(emptyElement(XML_DEADLOCK));215 xmlQuery.append(emptyElement(XML_FALSE));
213 }216 }
214 217
215 public void visit(TCTLConstNode tctlConstNode, Object context){218 public void visit(TCTLDeadlockNode tctlDeadLockNode, Object context) {
216 XMLQuery.append(wrapInTag(String.valueOf(tctlConstNode.getConstant()) + "", XML_INTEGERCONSTANT));219 xmlQuery.append(emptyElement(XML_DEADLOCK));
217 }220 }
218221
219 public void visit(TCTLPlaceNode tctlPlaceNode, Object context){222 public void visit(TCTLConstNode tctlConstNode, Object context) {
220 XMLQuery.append(startTag(XML_TOKENSCOUNT));223 xmlQuery.append(wrapInTag(tctlConstNode.getConstant() + "", XML_INTEGERCONSTANT));
221 XMLQuery.append(wrapInTag(tctlPlaceNode.toString() + "", XML_PLACE));224 }
222 XMLQuery.append(endTag(XML_TOKENSCOUNT));225
223 }226 public void visit(TCTLPlaceNode tctlPlaceNode, Object context) {
224227 xmlQuery.append(startTag(XML_TOKENSCOUNT));
225 public void visit(TCTLTransitionNode tctlTransitionNode, Object context){ 228 xmlQuery.append(wrapInTag(tctlPlaceNode.toString() + "", XML_PLACE));
226 XMLQuery.append(startTag(XML_ISFIREABLE));229 xmlQuery.append(endTag(XML_TOKENSCOUNT));
227 XMLQuery.append(wrapInTag(tctlTransitionNode.toString() + "", XML_TRANSITION));230 }
228 XMLQuery.append(endTag(XML_ISFIREABLE));231
229 }232 public void visit(TCTLTransitionNode tctlTransitionNode, Object context) {
230 233 xmlQuery.append(startTag(XML_ISFIREABLE));
231 @Override234 xmlQuery.append(wrapInTag(tctlTransitionNode.toString() + "", XML_TRANSITION));
232 public void visit(TCTLAtomicPropositionNode atomicPropositionNode,235 xmlQuery.append(endTag(XML_ISFIREABLE));
233 Object context) {236 }
234 String opTest = atomicPropositionNode.getOp();237
235 String op = new String();238 @Override
236 239 public void visit(TCTLAtomicPropositionNode atomicPropositionNode, Object context) {
237 if (opTest.equals("<")){240 String opTest = atomicPropositionNode.getOp();
238 op = XML_INTEGERLT;241 String op;
239 } else if(opTest.equals("<=")){242
240 op = XML_INTEGERLE;243 switch (opTest) {
241 } else if(opTest.equals("=")){244 case "<":
242 op = XML_INTEGEREQ;245 op = XML_INTEGERLT;
243 } else if(opTest.equals("!=")){246 break;
244 op = XML_INTEGERNE;247 case "<=":
245 } else if(opTest.equals(">")){248 op = XML_INTEGERLE;
246 op = XML_INTEGERGT;249 break;
247 } else if(opTest.equals(">=")){250 case "=":
248 op = XML_INTEGERGE;251 op = XML_INTEGEREQ;
249 } else {252 break;
250 op = "MISSING_OPERATOR";253 case "!=":
251 }254 op = XML_INTEGERNE;
252 255 break;
253 XMLQuery.append(startTag(op));256 case ">":
254 atomicPropositionNode.getLeft().accept(this, context);257 op = XML_INTEGERGT;
255 atomicPropositionNode.getRight().accept(this, context);258 break;
256 XMLQuery.append(endTag(op));259 case ">=":
257 }260 op = XML_INTEGERGE;
258 261 break;
259 private String wrapInTag(String str, String tag){262 default:
260 return startTag(tag) + str + endTag(tag);263 op = "MISSING_OPERATOR";
261 }264 break;
262 private String startTag(String tag){265 }
263 return "<" + tag + ">";266
264 }267 xmlQuery.append(startTag(op));
265 private String endTag(String tag){268 atomicPropositionNode.getLeft().accept(this, context);
266 return "</" + tag + ">";269 atomicPropositionNode.getRight().accept(this, context);
267 }270 xmlQuery.append(endTag(op));
268 private String emptyElement(String tag){271 }
269 return startTag(tag + "/");272
270 } 273 private String wrapInTag(String str, String tag) {
274 return startTag(tag) + str + endTag(tag);
275 }
276
277 private String startTag(String tag) {
278 return "<" + tag + ">";
279 }
280
281 private String endTag(String tag) {
282 return "</" + tag + ">";
283 }
284
285 private String emptyElement(String tag) {
286 return startTag(tag + "/");
287 }
271}288}
272289
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/CombiTranslationQueryVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/CombiTranslationQueryVisitor.java 2019-03-22 10:13:18 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/CombiTranslationQueryVisitor.java 2022-07-21 13:30:11 +0000
@@ -11,13 +11,13 @@
11 protected static final String PLOCK = "P_lock";11 protected static final String PLOCK = "P_lock";
12 protected static final String TOKEN_TEMPLATE_NAME = "Token";12 protected static final String TOKEN_TEMPLATE_NAME = "Token";
1313
14 private boolean useSymmetry;14 private final boolean useSymmetry;
15 private int totalTokens;15 private final int totalTokens;
16 private TimedArcPetriNet model;16 private final TimedArcPetriNet model;
17 private Hashtable<String, Boolean> placeNameToTimed;17 private final Hashtable<String, Boolean> placeNameToTimed;
18 private int maxDegDif;18 private final int maxDegDif;
19 private int initTransitions;19 private final int initTransitions;
20 private int maxTimeIn;20 private final int maxTimeIn;
2121
22 public CombiTranslationQueryVisitor(boolean useSymmetry, int totalTokens, TimedArcPetriNet model, Hashtable<String, Boolean> placeNameToTimed, int maxDegDif, int initTransitions, int maxTimeIn) {22 public CombiTranslationQueryVisitor(boolean useSymmetry, int totalTokens, TimedArcPetriNet model, Hashtable<String, Boolean> placeNameToTimed, int maxDegDif, int initTransitions, int maxTimeIn) {
23 this.useSymmetry = useSymmetry;23 this.useSymmetry = useSymmetry;
2424
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/ContainsPlaceWithDisabledTemplateVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/ContainsPlaceWithDisabledTemplateVisitor.java 2014-05-22 20:26:41 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/ContainsPlaceWithDisabledTemplateVisitor.java 2022-07-21 13:30:11 +0000
@@ -6,7 +6,7 @@
66
7public class ContainsPlaceWithDisabledTemplateVisitor extends VisitorBase implements ITCTLVisitor {7public class ContainsPlaceWithDisabledTemplateVisitor extends VisitorBase implements ITCTLVisitor {
8 8
9 private TimedArcPetriNetNetwork network;9 private final TimedArcPetriNetNetwork network;
1010
11 public ContainsPlaceWithDisabledTemplateVisitor(TimedArcPetriNetNetwork network){11 public ContainsPlaceWithDisabledTemplateVisitor(TimedArcPetriNetNetwork network){
12 this.network = network;12 this.network = network;
@@ -14,15 +14,18 @@
1414
15 @Override15 @Override
16 public void visit(TCTLPlaceNode placeNode, Object context) {16 public void visit(TCTLPlaceNode placeNode, Object context) {
17 if(placeNode.getTemplate().equals("") && network.getSharedPlaceByName(placeNode.getPlace()) != null)17 if(placeNode.getTemplate().equals("") && network.getSharedPlaceByName(placeNode.getPlace()) != null) {
18 return;18 return;
19 }
19 20
20 for(TimedArcPetriNet net : network.activeTemplates()) {21 for(TimedArcPetriNet net : network.activeTemplates()) {
21 if(placeNode.getTemplate().equals(net.name()) && net.getPlaceByName(placeNode.getPlace()) != null) 22 if(placeNode.getTemplate().equals(net.name()) && net.getPlaceByName(placeNode.getPlace()) != null) {
22 return;23 return;
24 }
23 }25 }
24 26
25 if(context instanceof BooleanResult)27 if(context instanceof BooleanResult) {
26 ((BooleanResult)context).setResult(false);28 ((BooleanResult)context).setResult(false);
29 }
27 }30 }
28}31}
2932
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/ContainsSharedPlaceVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/ContainsSharedPlaceVisitor.java 2014-05-22 20:26:41 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/ContainsSharedPlaceVisitor.java 2022-07-21 13:30:11 +0000
@@ -3,7 +3,7 @@
3import dk.aau.cs.TCTL.TCTLPlaceNode;3import dk.aau.cs.TCTL.TCTLPlaceNode;
44
5public class ContainsSharedPlaceVisitor extends VisitorBase implements ITCTLVisitor {5public class ContainsSharedPlaceVisitor extends VisitorBase implements ITCTLVisitor {
6 private String sharedPlaceName;6 private final String sharedPlaceName;
77
8 public ContainsSharedPlaceVisitor(String sharedPlaceName){8 public ContainsSharedPlaceVisitor(String sharedPlaceName){
9 this.sharedPlaceName = sharedPlaceName;9 this.sharedPlaceName = sharedPlaceName;
@@ -11,8 +11,9 @@
1111
12 @Override12 @Override
13 public void visit(TCTLPlaceNode placeNode, Object context) {13 public void visit(TCTLPlaceNode placeNode, Object context) {
14 if(placeNode.getTemplate().equals("") && placeNode.getPlace().equals(sharedPlaceName)) 14 if(placeNode.getTemplate().equals("") && placeNode.getPlace().equals(sharedPlaceName)) {
15 ((BooleanResult)context).setResult(true);15 ((BooleanResult)context).setResult(true);
16 }
16 }17 }
1718
18}19}
1920
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/ContainsSharedTransitionVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/ContainsSharedTransitionVisitor.java 2017-03-12 00:33:00 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/ContainsSharedTransitionVisitor.java 2022-07-21 13:30:11 +0000
@@ -3,7 +3,7 @@
3import dk.aau.cs.TCTL.TCTLTransitionNode;3import dk.aau.cs.TCTL.TCTLTransitionNode;
44
5public class ContainsSharedTransitionVisitor extends VisitorBase implements ITCTLVisitor {5public class ContainsSharedTransitionVisitor extends VisitorBase implements ITCTLVisitor {
6 private String sharedTransitionName;6 private final String sharedTransitionName;
77
8 public ContainsSharedTransitionVisitor(String sharedTransitionName){8 public ContainsSharedTransitionVisitor(String sharedTransitionName){
9 this.sharedTransitionName = sharedTransitionName;9 this.sharedTransitionName = sharedTransitionName;
1010
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/FixAbbrivPlaceNames.java'
--- src/dk/aau/cs/TCTL/visitors/FixAbbrivPlaceNames.java 2014-11-01 09:31:54 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/FixAbbrivPlaceNames.java 2022-07-21 13:30:11 +0000
@@ -1,8 +1,3 @@
1/*
2 * To change this license header, choose License Headers in Project Properties.
3 * To change this template file, choose Tools | Templates
4 * and open the template in the editor.
5 */
6package dk.aau.cs.TCTL.visitors;1package dk.aau.cs.TCTL.visitors;
72
8import dk.aau.cs.TCTL.TCTLAbstractProperty;3import dk.aau.cs.TCTL.TCTLAbstractProperty;
@@ -10,13 +5,9 @@
10import dk.aau.cs.util.Tuple;5import dk.aau.cs.util.Tuple;
11import java.util.ArrayList;6import java.util.ArrayList;
127
13/**
14 *
15 * @author jakob
16 */
17public class FixAbbrivPlaceNames extends VisitorBase {8public class FixAbbrivPlaceNames extends VisitorBase {
189
19 private ArrayList<Tuple<String, String>> templatePlaceNames;10 private final ArrayList<Tuple<String, String>> templatePlaceNames;
2011
21 public FixAbbrivPlaceNames(ArrayList<Tuple<String, String>> templatePlaceNames) {12 public FixAbbrivPlaceNames(ArrayList<Tuple<String, String>> templatePlaceNames) {
22 this.templatePlaceNames = templatePlaceNames;13 this.templatePlaceNames = templatePlaceNames;
2314
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/FixAbbrivTransitionNames.java'
--- src/dk/aau/cs/TCTL/visitors/FixAbbrivTransitionNames.java 2017-03-12 00:33:00 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/FixAbbrivTransitionNames.java 2022-07-21 13:30:11 +0000
@@ -12,7 +12,7 @@
1212
13public class FixAbbrivTransitionNames extends VisitorBase {13public class FixAbbrivTransitionNames extends VisitorBase {
1414
15 private ArrayList<Tuple<String, String>> templateTransitionNames;15 private final ArrayList<Tuple<String, String>> templateTransitionNames;
1616
17 public FixAbbrivTransitionNames(ArrayList<Tuple<String, String>> templateTransitionNames) {17 public FixAbbrivTransitionNames(ArrayList<Tuple<String, String>> templateTransitionNames) {
18 this.templateTransitionNames = templateTransitionNames;18 this.templateTransitionNames = templateTransitionNames;
1919
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/HasDeadlockVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/HasDeadlockVisitor.java 2013-05-18 21:26:56 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/HasDeadlockVisitor.java 2022-07-21 13:30:11 +0000
@@ -16,7 +16,7 @@
16 ((Context)context).hasDeadlock = true;16 ((Context)context).hasDeadlock = true;
17 }17 }
1818
19 private class Context{19 private static class Context{
20 public boolean hasDeadlock = true;20 public boolean hasDeadlock = true;
21 }21 }
22}22}
2323
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/IsReachabilityVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/IsReachabilityVisitor.java 2017-08-03 11:48:35 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/IsReachabilityVisitor.java 2022-07-21 13:30:11 +0000
@@ -4,7 +4,7 @@
44
5public class IsReachabilityVisitor extends VisitorBase {5public class IsReachabilityVisitor extends VisitorBase {
66
7 private class Context{7 private static class Context{
8 public boolean isReachability = true;8 public boolean isReachability = true;
9 public int nTempOp = 0; // number of temporal operators9 public int nTempOp = 0; // number of temporal operators
10 }10 }
1111
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/LTLQueryVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/LTLQueryVisitor.java 2021-10-14 06:28:05 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/LTLQueryVisitor.java 2022-07-21 13:30:11 +0000
@@ -7,45 +7,45 @@
77
8public class LTLQueryVisitor extends VisitorBase {8public class LTLQueryVisitor extends VisitorBase {
99
10 private static final String XML_NS = "xmlns=\"http://tapaal.net/\"";10 private static final String XML_NS = "xmlns=\"http://tapaal.net/\"";
11 private static final String XML_PROPSET = "property-set";11 private static final String XML_PROPSET = "property-set";
12 private static final String XML_PROP = "property";12 private static final String XML_PROP = "property";
13 private static final String XML_PROPID = "id";13 private static final String XML_PROPID = "id";
14 private static final String XML_PROPDESC = "description";14 private static final String XML_PROPDESC = "description";
15 private static final String XML_FORMULA = "formula";15 private static final String XML_FORMULA = "formula";
16 private static final String XML_ALLPATHS = "all-paths";16 private static final String XML_ALLPATHS = "all-paths";
17 private static final String XML_EXISTSPATH = "exists-path";17 private static final String XML_EXISTSPATH = "exists-path";
18 private static final String XML_NEGATION = "negation";18 private static final String XML_NEGATION = "negation";
19 private static final String XML_CONJUNCTION = "conjunction";19 private static final String XML_CONJUNCTION = "conjunction";
20 private static final String XML_DISJUNCTION = "disjunction";20 private static final String XML_DISJUNCTION = "disjunction";
21 private static final String XML_GLOBALLY = "globally";21 private static final String XML_GLOBALLY = "globally";
22 private static final String XML_FINALLY = "finally";22 private static final String XML_FINALLY = "finally";
23 private static final String XML_NEXT = "next";23 private static final String XML_NEXT = "next";
24 private static final String XML_UNTIL = "until";24 private static final String XML_UNTIL = "until";
25 private static final String XML_BEFORE = "before";25 private static final String XML_BEFORE = "before";
26 private static final String XML_REACH = "reach";26 private static final String XML_REACH = "reach";
27 private static final String XML_DEADLOCK = "deadlock";27 private static final String XML_DEADLOCK = "deadlock";
28 private static final String XML_TRUE = "true";28 private static final String XML_TRUE = "true";
29 private static final String XML_FALSE = "false";29 private static final String XML_FALSE = "false";
30 private static final String XML_INTEGERLT = "integer-lt";30 private static final String XML_INTEGERLT = "integer-lt";
31 private static final String XML_INTEGERLE = "integer-le";31 private static final String XML_INTEGERLE = "integer-le";
32 private static final String XML_INTEGEREQ = "integer-eq";32 private static final String XML_INTEGEREQ = "integer-eq";
33 private static final String XML_INTEGERNE = "integer-ne";33 private static final String XML_INTEGERNE = "integer-ne";
34 private static final String XML_INTEGERGT = "integer-gt";34 private static final String XML_INTEGERGT = "integer-gt";
35 private static final String XML_INTEGERGE = "integer-ge";35 private static final String XML_INTEGERGE = "integer-ge";
36 private static final String XML_ISFIREABLE = "is-fireable";36 private static final String XML_ISFIREABLE = "is-fireable";
37 private static final String XML_INTEGERCONSTANT = "integer-constant";37 private static final String XML_INTEGERCONSTANT = "integer-constant";
38 private static final String XML_TOKENSCOUNT = "tokens-count";38 private static final String XML_TOKENSCOUNT = "tokens-count";
39 private static final String XML_PLACE = "place";39 private static final String XML_PLACE = "place";
40 private static final String XML_TRANSITION = "transition";40 private static final String XML_TRANSITION = "transition";
41 private static final String XML_INTEGERSUM = "integer-sum";41 private static final String XML_INTEGERSUM = "integer-sum";
42 private static final String XML_INTEGERPRODUCT = "integer-product";42 private static final String XML_INTEGERPRODUCT = "integer-product";
43 private static final String XML_INTEGERDIFFERENCE = "integer-difference";43 private static final String XML_INTEGERDIFFERENCE = "integer-difference";
4444
45 private StringBuffer XMLQuery;45 private final StringBuffer xmlQuery = new StringBuffer();
4646
47 public LTLQueryVisitor() {47 public LTLQueryVisitor() {
48 this.XMLQuery = new StringBuffer();48 super();
49 }49 }
5050
51 public String getXMLQueryFor(TCTLAbstractProperty property, String queryName) {51 public String getXMLQueryFor(TCTLAbstractProperty property, String queryName) {
@@ -54,20 +54,20 @@
54 }54 }
5555
56 public void buildXMLQuery(TCTLAbstractProperty property, String queryName) {56 public void buildXMLQuery(TCTLAbstractProperty property, String queryName) {
57 XMLQuery.append(startTag(XML_PROP) + queryInfo(queryName) + startTag(XML_FORMULA));57 xmlQuery.append(startTag(XML_PROP) + queryInfo(queryName) + startTag(XML_FORMULA));
58 property.accept(this, null);58 property.accept(this, null);
59 XMLQuery.append(endTag(XML_FORMULA) + endTag(XML_PROP));59 xmlQuery.append(endTag(XML_FORMULA) + endTag(XML_PROP));
60 }60 }
6161
62 public String getFormatted() {62 public String getFormatted() {
63 XMLFormatter formatter = new XMLFormatter();63 XMLFormatter formatter = new XMLFormatter();
64 return formatter.format(getStartTag() + XMLQuery.toString() + getEndTag());64 return formatter.format(getStartTag() + xmlQuery.toString() + getEndTag());
65 }65 }
6666
67 public String getFormatted(StringBuffer CTLQueries) {67 public String getFormatted(StringBuffer CTLQueries) {
68 XMLFormatter formatter = new XMLFormatter();68 XMLFormatter formatter = new XMLFormatter();
69 XMLQuery.append(CTLQueries);69 xmlQuery.append(CTLQueries);
70 return formatter.format(getStartTag() + XMLQuery.toString() + getEndTag());70 return formatter.format(getStartTag() + xmlQuery.toString() + getEndTag());
71 }71 }
7272
73 public String getStartTag(){73 public String getStartTag(){
@@ -84,41 +84,41 @@
84 }84 }
8585
86 public void visit(LTLANode aNode, Object context) {86 public void visit(LTLANode aNode, Object context) {
87 XMLQuery.append(startTag(XML_ALLPATHS));87 xmlQuery.append(startTag(XML_ALLPATHS));
88 aNode.getProperty().accept(this, context);88 aNode.getProperty().accept(this, context);
89 XMLQuery.append(endTag(XML_ALLPATHS));89 xmlQuery.append(endTag(XML_ALLPATHS));
90 }90 }
9191
92 public void visit(LTLENode eNode, Object context) {92 public void visit(LTLENode eNode, Object context) {
93 XMLQuery.append(startTag(XML_EXISTSPATH));93 xmlQuery.append(startTag(XML_EXISTSPATH));
94 eNode.getProperty().accept(this, context);94 eNode.getProperty().accept(this, context);
95 XMLQuery.append(endTag(XML_EXISTSPATH));95 xmlQuery.append(endTag(XML_EXISTSPATH));
96 }96 }
9797
98 public void visit(LTLFNode afNode, Object context) {98 public void visit(LTLFNode afNode, Object context) {
99 XMLQuery.append(startTag(XML_FINALLY));99 xmlQuery.append(startTag(XML_FINALLY));
100 afNode.getProperty().accept(this, context);100 afNode.getProperty().accept(this, context);
101 XMLQuery.append(endTag(XML_FINALLY));101 xmlQuery.append(endTag(XML_FINALLY));
102 }102 }
103103
104 public void visit(LTLGNode agNode, Object context) {104 public void visit(LTLGNode agNode, Object context) {
105 XMLQuery.append(startTag(XML_GLOBALLY));105 xmlQuery.append(startTag(XML_GLOBALLY));
106 agNode.getProperty().accept(this, context);106 agNode.getProperty().accept(this, context);
107 XMLQuery.append(endTag(XML_GLOBALLY));107 xmlQuery.append(endTag(XML_GLOBALLY));
108 }108 }
109109
110 public void visit(LTLXNode axNode, Object context) {110 public void visit(LTLXNode axNode, Object context) {
111 XMLQuery.append(startTag(XML_NEXT));111 xmlQuery.append(startTag(XML_NEXT));
112 axNode.getProperty().accept(this, context);112 axNode.getProperty().accept(this, context);
113 XMLQuery.append(endTag(XML_NEXT));113 xmlQuery.append(endTag(XML_NEXT));
114 }114 }
115115
116 public void visit(LTLUNode auNode, Object context) {116 public void visit(LTLUNode auNode, Object context) {
117 XMLQuery.append(startTag(XML_UNTIL) + startTag(XML_BEFORE));117 xmlQuery.append(startTag(XML_UNTIL) + startTag(XML_BEFORE));
118 auNode.getLeft().accept(this, context);118 auNode.getLeft().accept(this, context);
119 XMLQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));119 xmlQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
120 auNode.getRight().accept(this, context);120 auNode.getRight().accept(this, context);
121 XMLQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL));121 xmlQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL));
122 }122 }
123123
124 public void visit(TCTLPathToStateConverter pathConverter, Object context) {124 public void visit(TCTLPathToStateConverter pathConverter, Object context) {
@@ -137,85 +137,96 @@
137 assert termListNode.getProperties().get(1) instanceof AritmeticOperator;137 assert termListNode.getProperties().get(1) instanceof AritmeticOperator;
138 AritmeticOperator operator = (AritmeticOperator)termListNode.getProperties().get(1);138 AritmeticOperator operator = (AritmeticOperator)termListNode.getProperties().get(1);
139 String op = operator.toString();139 String op = operator.toString();
140 if (op.equals("+")) {140 switch (op) {
141 createList(termListNode.getProperties(), context, XML_INTEGERSUM);141 case "+":
142 } else if (op.equals("*")) {142 createList(termListNode.getProperties(), context, XML_INTEGERSUM);
143 createList(termListNode.getProperties(), context, XML_INTEGERPRODUCT);143 break;
144 } else if (op.equals("-")) {144 case "*":
145 createList(termListNode.getProperties(), context, XML_INTEGERDIFFERENCE);145 createList(termListNode.getProperties(), context, XML_INTEGERPRODUCT);
146 break;
147 case "-":
148 createList(termListNode.getProperties(), context, XML_INTEGERDIFFERENCE);
149 break;
146 }150 }
147 }151 }
148152
149 private void createList(List<TCTLAbstractStateProperty> properties, Object context, String seperator) {153 private void createList(List<TCTLAbstractStateProperty> properties, Object context, String seperator) {
150 XMLQuery.append(startTag(seperator));154 xmlQuery.append(startTag(seperator));
151155
152 for (TCTLAbstractStateProperty p : properties) {156 for (TCTLAbstractStateProperty p : properties) {
153 p.accept(this, context);157 p.accept(this, context);
154 }158 }
155159
156 XMLQuery.append(endTag(seperator));160 xmlQuery.append(endTag(seperator));
157 }161 }
158162
159 public void visit(TCTLNotNode notNode, Object context) {163 public void visit(TCTLNotNode notNode, Object context) {
160 XMLQuery.append(startTag(XML_NEGATION));164 xmlQuery.append(startTag(XML_NEGATION));
161 notNode.getProperty().accept(this, context);165 notNode.getProperty().accept(this, context);
162 XMLQuery.append(endTag(XML_NEGATION));166 xmlQuery.append(endTag(XML_NEGATION));
163 }167 }
164168
165 public void visit(TCTLTrueNode tctlTrueNode, Object context) {169 public void visit(TCTLTrueNode tctlTrueNode, Object context) {
166 XMLQuery.append(emptyElement(XML_TRUE));170 xmlQuery.append(emptyElement(XML_TRUE));
167 }171 }
168172
169 public void visit(TCTLFalseNode tctlFalseNode, Object context) {173 public void visit(TCTLFalseNode tctlFalseNode, Object context) {
170 XMLQuery.append(emptyElement(XML_FALSE));174 xmlQuery.append(emptyElement(XML_FALSE));
171 }175 }
172176
173 public void visit(TCTLDeadlockNode tctlDeadLockNode, Object context) {177 public void visit(TCTLDeadlockNode tctlDeadLockNode, Object context) {
174 XMLQuery.append(emptyElement(XML_DEADLOCK));178 xmlQuery.append(emptyElement(XML_DEADLOCK));
175 }179 }
176180
177 public void visit(TCTLConstNode tctlConstNode, Object context){181 public void visit(TCTLConstNode tctlConstNode, Object context){
178 XMLQuery.append(wrapInTag(String.valueOf(tctlConstNode.getConstant()) + "", XML_INTEGERCONSTANT));182 xmlQuery.append(wrapInTag(tctlConstNode.getConstant() + "", XML_INTEGERCONSTANT));
179 }183 }
180184
181 public void visit(TCTLPlaceNode tctlPlaceNode, Object context){185 public void visit(TCTLPlaceNode tctlPlaceNode, Object context){
182 XMLQuery.append(startTag(XML_TOKENSCOUNT));186 xmlQuery.append(startTag(XML_TOKENSCOUNT));
183 XMLQuery.append(wrapInTag(tctlPlaceNode.toString() + "", XML_PLACE));187 xmlQuery.append(wrapInTag(tctlPlaceNode.toString() + "", XML_PLACE));
184 XMLQuery.append(endTag(XML_TOKENSCOUNT));188 xmlQuery.append(endTag(XML_TOKENSCOUNT));
185 }189 }
186190
187 public void visit(TCTLTransitionNode tctlTransitionNode, Object context){191 public void visit(TCTLTransitionNode tctlTransitionNode, Object context){
188 XMLQuery.append(startTag(XML_ISFIREABLE));192 xmlQuery.append(startTag(XML_ISFIREABLE));
189 XMLQuery.append(wrapInTag(tctlTransitionNode.toString() + "", XML_TRANSITION));193 xmlQuery.append(wrapInTag(tctlTransitionNode.toString() + "", XML_TRANSITION));
190 XMLQuery.append(endTag(XML_ISFIREABLE));194 xmlQuery.append(endTag(XML_ISFIREABLE));
191 }195 }
192196
193 @Override197 @Override
194 public void visit(TCTLAtomicPropositionNode atomicPropositionNode,198 public void visit(TCTLAtomicPropositionNode atomicPropositionNode, Object context) {
195 Object context) {
196 String opTest = atomicPropositionNode.getOp();199 String opTest = atomicPropositionNode.getOp();
197 String op = new String();200 String op;
198201
199 if (opTest.equals("<")){202 switch (opTest) {
200 op = XML_INTEGERLT;203 case "<":
201 } else if(opTest.equals("<=")){204 op = XML_INTEGERLT;
202 op = XML_INTEGERLE;205 break;
203 } else if(opTest.equals("=")){206 case "<=":
204 op = XML_INTEGEREQ;207 op = XML_INTEGERLE;
205 } else if(opTest.equals("!=")){208 break;
206 op = XML_INTEGERNE;209 case "=":
207 } else if(opTest.equals(">")){210 op = XML_INTEGEREQ;
208 op = XML_INTEGERGT;211 break;
209 } else if(opTest.equals(">=")){212 case "!=":
210 op = XML_INTEGERGE;213 op = XML_INTEGERNE;
211 } else {214 break;
212 op = "MISSING_OPERATOR";215 case ">":
216 op = XML_INTEGERGT;
217 break;
218 case ">=":
219 op = XML_INTEGERGE;
220 break;
221 default:
222 op = "MISSING_OPERATOR";
223 break;
213 }224 }
214225
215 XMLQuery.append(startTag(op));226 xmlQuery.append(startTag(op));
216 atomicPropositionNode.getLeft().accept(this, context);227 atomicPropositionNode.getLeft().accept(this, context);
217 atomicPropositionNode.getRight().accept(this, context);228 atomicPropositionNode.getRight().accept(this, context);
218 XMLQuery.append(endTag(op));229 xmlQuery.append(endTag(op));
219 }230 }
220231
221 private String wrapInTag(String str, String tag){232 private String wrapInTag(String str, String tag){
222233
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/OptimizedStandardTranslationQueryVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/OptimizedStandardTranslationQueryVisitor.java 2019-03-23 07:51:29 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/OptimizedStandardTranslationQueryVisitor.java 2022-07-21 13:30:11 +0000
@@ -11,8 +11,8 @@
11 protected static final String LOCK_BOOL = "lock";11 protected static final String LOCK_BOOL = "lock";
1212
13 protected static final String TOKEN_TEMPLATE_NAME = "Token";13 protected static final String TOKEN_TEMPLATE_NAME = "Token";
14 private boolean useSymmetry;14 private final boolean useSymmetry;
15 private int totalTokens;15 private final int totalTokens;
1616
17 public OptimizedStandardTranslationQueryVisitor(int totalTokens, boolean useSymmetry) {17 public OptimizedStandardTranslationQueryVisitor(int totalTokens, boolean useSymmetry) {
18 this.useSymmetry = useSymmetry;18 this.useSymmetry = useSymmetry;
1919
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/RenamePlaceTCTLVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/RenamePlaceTCTLVisitor.java 2014-05-22 20:26:41 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/RenamePlaceTCTLVisitor.java 2022-07-21 13:30:11 +0000
@@ -4,8 +4,8 @@
44
5public class RenamePlaceTCTLVisitor extends VisitorBase{5public class RenamePlaceTCTLVisitor extends VisitorBase{
66
7 private String oldPlaceName;7 private final String oldPlaceName;
8 private String newPlaceName;8 private final String newPlaceName;
99
10 public RenamePlaceTCTLVisitor(String oldName, String newName) {10 public RenamePlaceTCTLVisitor(String oldName, String newName) {
11 oldPlaceName = oldName;11 oldPlaceName = oldName;
1212
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/RenameTransitionTCTLVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/RenameTransitionTCTLVisitor.java 2017-03-12 00:33:00 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/RenameTransitionTCTLVisitor.java 2022-07-21 13:30:11 +0000
@@ -4,8 +4,8 @@
44
5public class RenameTransitionTCTLVisitor extends VisitorBase{5public class RenameTransitionTCTLVisitor extends VisitorBase{
66
7 private String oldTransitionName;7 private final String oldTransitionName;
8 private String newTransitionName;8 private final String newTransitionName;
99
10 public RenameTransitionTCTLVisitor(String oldName, String newName) {10 public RenameTransitionTCTLVisitor(String oldName, String newName) {
11 oldTransitionName = oldName;11 oldTransitionName = oldName;
1212
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/StandardTranslationQueryVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/StandardTranslationQueryVisitor.java 2019-03-23 07:51:29 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/StandardTranslationQueryVisitor.java 2022-07-21 13:30:11 +0000
@@ -12,7 +12,7 @@
1212
13 protected static final String TOKEN_TEMPLATE_NAME = "Token";13 protected static final String TOKEN_TEMPLATE_NAME = "Token";
1414
15 private int totalTokens;15 private final int totalTokens;
1616
17 public StandardTranslationQueryVisitor(int totalTokens) {17 public StandardTranslationQueryVisitor(int totalTokens) {
18 this.totalTokens = totalTokens;18 this.totalTokens = totalTokens;
1919
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/VerifyPlaceNamesVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/VerifyPlaceNamesVisitor.java 2017-03-12 00:33:00 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/VerifyPlaceNamesVisitor.java 2022-07-21 13:30:11 +0000
@@ -9,7 +9,7 @@
99
10public class VerifyPlaceNamesVisitor extends VisitorBase {10public class VerifyPlaceNamesVisitor extends VisitorBase {
1111
12 private ArrayList<Tuple<String, String>> templatePlaceNames;12 private final ArrayList<Tuple<String, String>> templatePlaceNames;
1313
14 public VerifyPlaceNamesVisitor(ArrayList<Tuple<String, String>> templatePlaceNames) {14 public VerifyPlaceNamesVisitor(ArrayList<Tuple<String, String>> templatePlaceNames) {
15 this.templatePlaceNames = templatePlaceNames;15 this.templatePlaceNames = templatePlaceNames;
@@ -31,11 +31,10 @@
31 c.setResult(false);31 c.setResult(false);
32 }32 }
33 }33 }
34 34
35 // / context class35 public static class Context {
36 public class Context {
37 private Boolean result;36 private Boolean result;
38 private HashSet<String> incorrectPlaceNames;37 private final HashSet<String> incorrectPlaceNames;
3938
40 public Boolean getResult() {39 public Boolean getResult() {
41 return result;40 return result;
4241
=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/VerifyTransitionNamesVisitor.java'
--- src/dk/aau/cs/TCTL/visitors/VerifyTransitionNamesVisitor.java 2017-03-12 00:33:00 +0000
+++ src/main/java/dk/aau/cs/TCTL/visitors/VerifyTransitionNamesVisitor.java 2022-07-21 13:30:11 +0000
@@ -8,7 +8,7 @@
8import dk.aau.cs.util.Tuple;8import dk.aau.cs.util.Tuple;
99
10public class VerifyTransitionNamesVisitor extends VisitorBase {10public class VerifyTransitionNamesVisitor extends VisitorBase {
11 private ArrayList<Tuple<String, String>> templateTransitionNames;11 private final ArrayList<Tuple<String, String>> templateTransitionNames;
1212
13 public VerifyTransitionNamesVisitor(ArrayList<Tuple<String, String>> templateTransitionNames) {13 public VerifyTransitionNamesVisitor(ArrayList<Tuple<String, String>> templateTransitionNames) {
14 this.templateTransitionNames = templateTransitionNames;14 this.templateTransitionNames = templateTransitionNames;
@@ -30,11 +30,10 @@
30 c.setResult(false);30 c.setResult(false);
31 }31 }
32 }32 }
33 33
34 // / context class34 public static class Context {
35 public class Context {
36 private Boolean result;35 private Boolean result;
37 private HashSet<String> incorrectTransitionNames;36 private final HashSet<String> incorrectTransitionNames;
3837
39 public Boolean getResult() {38 public Boolean getResult() {
40 return result;39 return result;
4140
=== modified file 'src/main/java/dk/aau/cs/approximation/ApproximationWorker.java'
--- src/dk/aau/cs/approximation/ApproximationWorker.java 2020-12-16 21:11:57 +0000
+++ src/main/java/dk/aau/cs/approximation/ApproximationWorker.java 2022-07-21 13:30:11 +0000
@@ -2,9 +2,12 @@
22
3import java.math.BigDecimal;3import java.math.BigDecimal;
44
5import pipe.dataLayer.TAPNQuery.TraceOption;5import net.tapaal.gui.petrinet.TAPNLens;
6import pipe.gui.RunVerificationBase;6import pipe.gui.petrinet.dataLayer.DataLayer;
7import pipe.gui.widgets.InclusionPlaces;7import net.tapaal.gui.petrinet.verification.TAPNQuery.TraceOption;
8import pipe.gui.TAPAALGUI;
9import net.tapaal.gui.petrinet.verification.RunVerificationBase;
10import net.tapaal.gui.petrinet.verification.InclusionPlaces;
8import dk.aau.cs.Messenger;11import dk.aau.cs.Messenger;
9import dk.aau.cs.io.batchProcessing.LoadedBatchProcessingModel;12import dk.aau.cs.io.batchProcessing.LoadedBatchProcessingModel;
10import dk.aau.cs.model.tapn.TAPNQuery;13import dk.aau.cs.model.tapn.TAPNQuery;
@@ -32,14 +35,17 @@
3235
33public class ApproximationWorker {36public class ApproximationWorker {
34 public VerificationResult<TAPNNetworkTrace> normalWorker(37 public VerificationResult<TAPNNetworkTrace> normalWorker(
35 VerificationOptions options,38 VerificationOptions options,
36 ModelChecker modelChecker,39 ModelChecker modelChecker,
37 Tuple<TimedArcPetriNet, NameMapping> transformedModel,40 Tuple<TimedArcPetriNet, NameMapping> transformedModel,
38 ITAPNComposer composer,41 ITAPNComposer composer,
39 TAPNQuery clonedQuery,42 TAPNQuery clonedQuery,
40 RunVerificationBase verificationBase,43 RunVerificationBase verificationBase,
41 TimedArcPetriNetNetwork model44 TimedArcPetriNetNetwork model,
42 ) throws Exception {45 DataLayer guiModel,
46 net.tapaal.gui.petrinet.verification.TAPNQuery dataLayerQuery,
47 TAPNLens lens
48 ) throws Exception {
43 49
44 // If options is of an instance of VerifyTAPNOptions then save the inclusion places before verify alters them50 // If options is of an instance of VerifyTAPNOptions then save the inclusion places before verify alters them
45 InclusionPlaces oldInclusionPlaces = null;51 InclusionPlaces oldInclusionPlaces = null;
@@ -53,7 +59,9 @@
53 }59 }
54 60
55 VerificationResult<TAPNNetworkTrace> toReturn = null;61 VerificationResult<TAPNNetworkTrace> toReturn = null;
56 VerificationResult<TimedArcPetriNetTrace> result = modelChecker.verify(options, transformedModel, clonedQuery);62 VerificationResult<TimedArcPetriNetTrace> result;
63
64 result = modelChecker.verify(options, transformedModel, clonedQuery, guiModel, dataLayerQuery, lens);
5765
58 if (result.error()) {66 if (result.error()) {
59 options.setTraceOption(oldTraceOption);67 options.setTraceOption(oldTraceOption);
@@ -66,14 +74,19 @@
66 // If r = 174 // If r = 1
67 // No matter what it answered -> return that answer75 // No matter what it answered -> return that answer
68 QueryResult queryResult = result.getQueryResult();76 QueryResult queryResult = result.getQueryResult();
69 toReturn = new VerificationResult<TAPNNetworkTrace>(77 NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
70 queryResult,78 TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
71 decomposeTrace(result.getTrace(), transformedModel.value2(), model),79 toReturn = new VerificationResult<TAPNNetworkTrace>(
72 decomposeTrace(result.getSecondaryTrace(), transformedModel.value2(), model),80 queryResult,
73 result.verificationTime(),81 decomposeTrace(result.getTrace(), nameMapping, netNetwork),
74 result.stats(),82 decomposeTrace(result.getSecondaryTrace(), nameMapping, netNetwork),
75 result.isSolvedUsingStateEquation());83 result.verificationTime(),
76 toReturn.setNameMapping(transformedModel.value2());84 result.stats(),
85 false,
86 result.getUnfoldedModel());
87 toReturn.setNameMapping(transformedModel.value2());
88
89
77 } else {90 } else {
78 // If r > 191 // If r > 1
79 if (result.getTrace() != null && (((result.getQueryResult().queryType() == QueryType.EF || result.getQueryResult().queryType() == QueryType.EG) && result.getQueryResult().isQuerySatisfied())92 if (result.getTrace() != null && (((result.getQueryResult().queryType() == QueryType.EF || result.getQueryResult().queryType() == QueryType.EG) && result.getQueryResult().isQuerySatisfied())
@@ -82,14 +95,17 @@
82 // The results are inconclusive, but we get a trace and can use trace TAPN for verification.95 // The results are inconclusive, but we get a trace and can use trace TAPN for verification.
83 96
84 VerificationResult<TimedArcPetriNetTrace> approxResult = result;97 VerificationResult<TimedArcPetriNetTrace> approxResult = result;
85 toReturn = new VerificationResult<TAPNNetworkTrace>(98 NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
86 approxResult.getQueryResult(),99 TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
87 decomposeTrace(approxResult.getTrace(), transformedModel.value2(), model),100 toReturn = new VerificationResult<TAPNNetworkTrace>(
88 decomposeTrace(approxResult.getSecondaryTrace(), transformedModel.value2(), model),101 approxResult.getQueryResult(),
89 approxResult.verificationTime(),102 decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
90 approxResult.stats(),103 decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
91 approxResult.isSolvedUsingStateEquation());104 approxResult.verificationTime(),
92 toReturn.setNameMapping(transformedModel.value2());105 approxResult.stats(),
106 false,
107 approxResult.getUnfoldedModel());
108 toReturn.setNameMapping(nameMapping);
93 109
94 OverApproximation overaprx = new OverApproximation();110 OverApproximation overaprx = new OverApproximation();
95 111
@@ -103,7 +119,7 @@
103 119
104 // run model checker again for trace TAPN120 // run model checker again for trace TAPN
105 MemoryMonitor.cumulateMemory();121 MemoryMonitor.cumulateMemory();
106 result = modelChecker.verify(options, transformedOriginalModel, clonedQuery);122 result = modelChecker.verify(options, transformedOriginalModel, clonedQuery, guiModel, dataLayerQuery, null);
107123
108 if (result.error()) {124 if (result.error()) {
109 options.setTraceOption(oldTraceOption);125 options.setTraceOption(oldTraceOption);
@@ -127,14 +143,17 @@
127 143
128 // If satisfied trace -> Return result144 // If satisfied trace -> Return result
129 // This is satisfied for EF and EG and not satisfied for AG and AF145 // This is satisfied for EF and EG and not satisfied for AG and AF
130 toReturn = new VerificationResult<TAPNNetworkTrace>(146 toReturn = new VerificationResult<TAPNNetworkTrace>(
131 queryResult,147 queryResult,
132 decomposeTrace(result.getTrace(), transformedModel.value2(), model),148 decomposeTrace(result.getTrace(), nameMapping, netNetwork),
133 decomposeTrace(result.getSecondaryTrace(), transformedModel.value2(), model),149 decomposeTrace(result.getSecondaryTrace(), nameMapping, netNetwork),
134 approxResult.verificationTime() + result.verificationTime(),150 approxResult.verificationTime() + result.verificationTime(),
135 approxResult.stats(),151 approxResult.stats(),
136 approxResult.isSolvedUsingStateEquation());152 false,
137 toReturn.setNameMapping(transformedModel.value2());153 approxResult.getUnfoldedModel());
154 toReturn.setNameMapping(nameMapping);
155
156
138 } 157 }
139 else if (((result.getQueryResult().queryType() == QueryType.EF || result.getQueryResult().queryType() == QueryType.EG) && !result.getQueryResult().isQuerySatisfied())158 else if (((result.getQueryResult().queryType() == QueryType.EF || result.getQueryResult().queryType() == QueryType.EG) && !result.getQueryResult().isQuerySatisfied())
140 || ((result.getQueryResult().queryType() == QueryType.AG || result.getQueryResult().queryType() == QueryType.AF) && result.getQueryResult().isQuerySatisfied())) {159 || ((result.getQueryResult().queryType() == QueryType.AG || result.getQueryResult().queryType() == QueryType.AF) && result.getQueryResult().isQuerySatisfied())) {
@@ -147,14 +166,19 @@
147 }166 }
148 167
149 VerificationResult<TimedArcPetriNetTrace> approxResult = result;168 VerificationResult<TimedArcPetriNetTrace> approxResult = result;
150 toReturn = new VerificationResult<TAPNNetworkTrace>(169 NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
151 approxResult.getQueryResult(),170 TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
152 decomposeTrace(approxResult.getTrace(), transformedModel.value2(), model),171 toReturn = new VerificationResult<TAPNNetworkTrace>(
153 decomposeTrace(approxResult.getSecondaryTrace(), transformedModel.value2(), model),172 approxResult.getQueryResult(),
154 approxResult.verificationTime(),173 decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
155 approxResult.stats(),174 decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
156 approxResult.isSolvedUsingStateEquation());175 approxResult.verificationTime(),
157 toReturn.setNameMapping(transformedModel.value2());176 approxResult.stats(),
177 false,
178 approxResult.getUnfoldedModel());
179 toReturn.setNameMapping(nameMapping);
180
181
158 } else {182 } else {
159 // We cannot use the result directly, and did not get a trace.183 // We cannot use the result directly, and did not get a trace.
160 184
@@ -162,15 +186,18 @@
162 queryResult.setApproximationInconclusive(true);186 queryResult.setApproximationInconclusive(true);
163 187
164 VerificationResult<TimedArcPetriNetTrace> approxResult = result;188 VerificationResult<TimedArcPetriNetTrace> approxResult = result;
165 toReturn = new VerificationResult<TAPNNetworkTrace>(189 NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
166 approxResult.getQueryResult(),190 TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
167 decomposeTrace(approxResult.getTrace(), transformedModel.value2(), model),191 toReturn = new VerificationResult<TAPNNetworkTrace>(
168 decomposeTrace(approxResult.getSecondaryTrace(), transformedModel.value2(), model),192 approxResult.getQueryResult(),
169 approxResult.verificationTime(),193 decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
170 approxResult.stats(),194 decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
171 approxResult.isSolvedUsingStateEquation());195 approxResult.verificationTime(),
172 toReturn.setNameMapping(transformedModel.value2());196 approxResult.stats(),
173 197 false,
198 approxResult.getUnfoldedModel());
199 toReturn.setNameMapping(nameMapping);
200
174 }201 }
175 }202 }
176 } 203 }
@@ -194,14 +221,19 @@
194 // If r = 1221 // If r = 1
195 // No matter it answered -> return that answer222 // No matter it answered -> return that answer
196 QueryResult queryResult= result.getQueryResult();223 QueryResult queryResult= result.getQueryResult();
197 toReturn = new VerificationResult<TAPNNetworkTrace>(224 NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
198 queryResult,225 TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
199 decomposeTrace(result.getTrace(), transformedModel.value2(), model),226 toReturn = new VerificationResult<TAPNNetworkTrace>(
200 decomposeTrace(result.getSecondaryTrace(), transformedModel.value2(), model),227 queryResult,
201 result.verificationTime(),228 decomposeTrace(result.getTrace(), nameMapping, netNetwork),
202 result.stats(),229 decomposeTrace(result.getSecondaryTrace(), nameMapping, netNetwork),
203 result.isSolvedUsingStateEquation());230 result.verificationTime(),
204 toReturn.setNameMapping(transformedModel.value2());231 result.stats(),
232 false,
233 result.getUnfoldedModel());
234 toReturn.setNameMapping(nameMapping);
235
236
205 }237 }
206 else {238 else {
207 // If r > 1239 // If r > 1
@@ -210,14 +242,18 @@
210 // If ((EF OR EG) AND not satisfied) OR ((AG OR AF) and satisfied) -> Inconclusive242 // If ((EF OR EG) AND not satisfied) OR ((AG OR AF) and satisfied) -> Inconclusive
211 QueryResult queryResult= result.getQueryResult();243 QueryResult queryResult= result.getQueryResult();
212 queryResult.setApproximationInconclusive(true);244 queryResult.setApproximationInconclusive(true);
213 toReturn = new VerificationResult<TAPNNetworkTrace>(245 NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
214 queryResult,246 TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
215 decomposeTrace(result.getTrace(), transformedModel.value2(), model),247 toReturn = new VerificationResult<TAPNNetworkTrace>(
216 decomposeTrace(result.getSecondaryTrace(), transformedModel.value2(), model),248 queryResult,
217 result.verificationTime(),249 decomposeTrace(result.getTrace(), nameMapping, netNetwork),
218 result.stats(),250 decomposeTrace(result.getSecondaryTrace(), nameMapping, netNetwork),
219 result.isSolvedUsingStateEquation());251 result.verificationTime(),
220 toReturn.setNameMapping(transformedModel.value2());252 result.stats(),
253 false,
254 result.getUnfoldedModel());
255 toReturn.setNameMapping(nameMapping);
256
221 } else if ((result.getQueryResult().queryType() == QueryType.EF || result.getQueryResult().queryType() == QueryType.EG) && result.getQueryResult().isQuerySatisfied()257 } else if ((result.getQueryResult().queryType() == QueryType.EF || result.getQueryResult().queryType() == QueryType.EG) && result.getQueryResult().isQuerySatisfied()
222 || ((result.getQueryResult().queryType() == QueryType.AG || result.getQueryResult().queryType() == QueryType.AF) && ! result.getQueryResult().isQuerySatisfied())) {258 || ((result.getQueryResult().queryType() == QueryType.AG || result.getQueryResult().queryType() == QueryType.AF) && ! result.getQueryResult().isQuerySatisfied())) {
223 259
@@ -225,14 +261,19 @@
225 // If query does have deadlock or EG or AF a trace -> create trace TAPN261 // If query does have deadlock or EG or AF a trace -> create trace TAPN
226 //Create the verification satisfied result for the approximation262 //Create the verification satisfied result for the approximation
227 VerificationResult<TimedArcPetriNetTrace> approxResult = result;263 VerificationResult<TimedArcPetriNetTrace> approxResult = result;
228 toReturn = new VerificationResult<TAPNNetworkTrace>(264 NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
229 approxResult.getQueryResult(),265 TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
230 decomposeTrace(approxResult.getTrace(), transformedModel.value2(), model),266 toReturn = new VerificationResult<TAPNNetworkTrace>(
231 decomposeTrace(approxResult.getSecondaryTrace(), transformedModel.value2(), model),267 approxResult.getQueryResult(),
232 approxResult.verificationTime(),268 decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
233 approxResult.stats(),269 decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
234 result.isSolvedUsingStateEquation());270 approxResult.verificationTime(),
235 toReturn.setNameMapping(transformedModel.value2());271 approxResult.stats(),
272 false,
273 result.getUnfoldedModel());
274 toReturn.setNameMapping(nameMapping);
275
276
236 277
237 OverApproximation overaprx = new OverApproximation();278 OverApproximation overaprx = new OverApproximation();
238 279
@@ -247,7 +288,7 @@
247 288
248 //run model checker again for trace TAPN289 //run model checker again for trace TAPN
249 MemoryMonitor.cumulateMemory();290 MemoryMonitor.cumulateMemory();
250 result = modelChecker.verify(options, transformedOriginalModel, clonedQuery);291 result = modelChecker.verify(options, transformedOriginalModel, clonedQuery, guiModel, dataLayerQuery, null);
251292
252 if (result.error()) {293 if (result.error()) {
253 options.setTraceOption(oldTraceOption);294 options.setTraceOption(oldTraceOption);
@@ -271,16 +312,17 @@
271 || (result.getQueryResult().queryType() == QueryType.AF && queryResult.isQuerySatisfied())) {312 || (result.getQueryResult().queryType() == QueryType.AF && queryResult.isQuerySatisfied())) {
272 queryResult.setApproximationInconclusive(true);313 queryResult.setApproximationInconclusive(true);
273 }314 }
274 315
275 // If satisfied trace) -> Return result316 // If satisfied trace) -> Return result
276 // This is satisfied for EF and EG and not satisfied for AG and AF317 // This is satisfied for EF and EG and not satisfied for AG and AF
277 toReturn = new VerificationResult<TAPNNetworkTrace>(318 toReturn = new VerificationResult<TAPNNetworkTrace>(
278 queryResult,319 queryResult,
279 decomposeTrace(result.getTrace(), transformedModel.value2(), model),320 decomposeTrace(result.getTrace(), nameMapping, netNetwork),
280 decomposeTrace(result.getSecondaryTrace(), transformedModel.value2(), model),321 decomposeTrace(result.getSecondaryTrace(), nameMapping, netNetwork),
281 approxResult.verificationTime() + result.verificationTime(),322 approxResult.verificationTime() + result.verificationTime(),
282 approxResult.stats(),323 approxResult.stats(),
283 approxResult.isSolvedUsingStateEquation());324 false,
325 approxResult.getUnfoldedModel());
284 toReturn.setNameMapping(transformedModel.value2());326 toReturn.setNameMapping(transformedModel.value2());
285 }327 }
286 else {328 else {
@@ -289,28 +331,36 @@
289 queryResult.setApproximationInconclusive(true);331 queryResult.setApproximationInconclusive(true);
290 332
291 VerificationResult<TimedArcPetriNetTrace> approxResult = result;333 VerificationResult<TimedArcPetriNetTrace> approxResult = result;
334 NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
335 TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
336
292 toReturn = new VerificationResult<TAPNNetworkTrace>(337 toReturn = new VerificationResult<TAPNNetworkTrace>(
293 approxResult.getQueryResult(),338 approxResult.getQueryResult(),
294 decomposeTrace(approxResult.getTrace(), transformedModel.value2(), model),339 decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
295 decomposeTrace(approxResult.getSecondaryTrace(), transformedModel.value2(), model),340 decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
296 approxResult.verificationTime(),341 approxResult.verificationTime(),
297 approxResult.stats(),342 approxResult.stats(),
298 approxResult.isSolvedUsingStateEquation());343 false,
299 toReturn.setNameMapping(transformedModel.value2());344 approxResult.getUnfoldedModel());
345 toReturn.setNameMapping(nameMapping);
300 }346 }
301 }347 }
302 }348 }
303 } 349 }
304 else {350 else {
351 boolean isColored = (lens != null && lens.isColored() || model.isColored());
352 NameMapping nameMapping = isColored? result.getUnfoldedModel().value2(): transformedModel.value2();
353 TimedArcPetriNetNetwork netNetwork = isColored? result.getUnfoldedModel().value1().parentNetwork(): model;
305 toReturn = new VerificationResult<TAPNNetworkTrace>(354 toReturn = new VerificationResult<TAPNNetworkTrace>(
306 result.getQueryResult(),355 result.getQueryResult(),
307 decomposeTrace(result.getTrace(), transformedModel.value2(), model),356 decomposeTrace(result.getTrace(), nameMapping, netNetwork),
308 decomposeTrace(result.getSecondaryTrace(), transformedModel.value2(), model),357 decomposeTrace(result.getSecondaryTrace(), nameMapping, netNetwork),
309 result.verificationTime(),358 result.verificationTime(),
310 result.stats(),359 result.stats(),
311 result.isSolvedUsingStateEquation(),360 false,
312 result.getRawOutput());361 result.getRawOutput(),
313 toReturn.setNameMapping(transformedModel.value2());362 result.getUnfoldedModel());
363 toReturn.setNameMapping(nameMapping);
314 }364 }
315 365
316 options.setTraceOption(oldTraceOption);366 options.setTraceOption(oldTraceOption);
@@ -326,7 +376,7 @@
326 public VerificationResult<TimedArcPetriNetTrace> batchWorker(376 public VerificationResult<TimedArcPetriNetTrace> batchWorker(
327 Tuple<TimedArcPetriNet, NameMapping> composedModel,377 Tuple<TimedArcPetriNet, NameMapping> composedModel,
328 VerificationOptions options,378 VerificationOptions options,
329 pipe.dataLayer.TAPNQuery query,379 net.tapaal.gui.petrinet.verification.TAPNQuery query,
330 LoadedBatchProcessingModel model,380 LoadedBatchProcessingModel model,
331 ModelChecker modelChecker,381 ModelChecker modelChecker,
332 TAPNQuery queryToVerify,382 TAPNQuery queryToVerify,
@@ -354,7 +404,7 @@
354 options.setTraceOption(TraceOption.SOME);404 options.setTraceOption(TraceOption.SOME);
355 }405 }
356 406
357 VerificationResult<TimedArcPetriNetTrace> verificationResult = modelChecker.verify(options, composedModel, queryToVerify);407 VerificationResult<TimedArcPetriNetTrace> verificationResult = modelChecker.verify(options, composedModel, queryToVerify, null, query, null);
358 408
359 VerificationResult<TAPNNetworkTrace> valueNetwork = null; //The final result is meant to be a PetriNetTrace but to make traceTAPN we make a networktrace409 VerificationResult<TAPNNetworkTrace> valueNetwork = null; //The final result is meant to be a PetriNetTrace but to make traceTAPN we make a networktrace
360 VerificationResult<TimedArcPetriNetTrace> value = null;410 VerificationResult<TimedArcPetriNetTrace> value = null;
@@ -376,7 +426,8 @@
376 verificationResult.getSecondaryTrace(),426 verificationResult.getSecondaryTrace(),
377 verificationResult.verificationTime(),427 verificationResult.verificationTime(),
378 verificationResult.stats(),428 verificationResult.stats(),
379 verificationResult.isSolvedUsingStateEquation());429 false,
430 verificationResult.getUnfoldedModel());
380 value.setNameMapping(composedModel.value2());431 value.setNameMapping(composedModel.value2());
381 } else {432 } else {
382 // If r > 1433 // If r > 1
@@ -385,14 +436,17 @@
385 // If ((EF OR EG) AND satisfied) OR ((AG OR AF) AND not satisfied)436 // If ((EF OR EG) AND satisfied) OR ((AG OR AF) AND not satisfied)
386 //Create the verification satisfied result for the approximation437 //Create the verification satisfied result for the approximation
387 VerificationResult<TimedArcPetriNetTrace> approxResult = verificationResult;438 VerificationResult<TimedArcPetriNetTrace> approxResult = verificationResult;
439 NameMapping nameMapping = model.network().isColored()? verificationResult.getUnfoldedModel().value2(): composedModel.value2();
440 TimedArcPetriNetNetwork netNetwork = model.network().isColored()? verificationResult.getUnfoldedModel().value1().parentNetwork(): model.network();
388 valueNetwork = new VerificationResult<TAPNNetworkTrace>(441 valueNetwork = new VerificationResult<TAPNNetworkTrace>(
389 approxResult.getQueryResult(),442 approxResult.getQueryResult(),
390 decomposeTrace(approxResult.getTrace(), composedModel.value2(), model.network()),443 decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
391 decomposeTrace(approxResult.getSecondaryTrace(), composedModel.value2(), model.network()),444 decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
392 approxResult.verificationTime(),445 approxResult.verificationTime(),
393 approxResult.stats(),446 approxResult.stats(),
394 verificationResult.isSolvedUsingStateEquation());447 false,
395 valueNetwork.setNameMapping(composedModel.value2());448 verificationResult.getUnfoldedModel());
449 valueNetwork.setNameMapping(nameMapping);
396 450
397 OverApproximation overaprx = new OverApproximation();451 OverApproximation overaprx = new OverApproximation();
398 452
@@ -406,7 +460,7 @@
406460
407 //run model checker again for trace TAPN461 //run model checker again for trace TAPN
408 MemoryMonitor.cumulateMemory();462 MemoryMonitor.cumulateMemory();
409 verificationResult = modelChecker.verify(options, transformedOriginalModel, clonedQuery);463 verificationResult = modelChecker.verify(options, transformedOriginalModel, clonedQuery, null, query, null);
410464
411 if (verificationResult.error()) {465 if (verificationResult.error()) {
412 options.setTraceOption(oldTraceOption);466 options.setTraceOption(oldTraceOption);
@@ -432,7 +486,8 @@
432 approxResult.getSecondaryTrace(),486 approxResult.getSecondaryTrace(),
433 approxResult.verificationTime() + verificationResult.verificationTime(),487 approxResult.verificationTime() + verificationResult.verificationTime(),
434 approxResult.stats(),488 approxResult.stats(),
435 verificationResult.isSolvedUsingStateEquation());489 false,
490 verificationResult.getUnfoldedModel());
436 value.setNameMapping(composedModel.value2());491 value.setNameMapping(composedModel.value2());
437 }492 }
438 else if (((verificationResult.getQueryResult().queryType() == QueryType.EF || verificationResult.getQueryResult().queryType() == QueryType.EG) && !verificationResult.getQueryResult().isQuerySatisfied())493 else if (((verificationResult.getQueryResult().queryType() == QueryType.EF || verificationResult.getQueryResult().queryType() == QueryType.EG) && !verificationResult.getQueryResult().isQuerySatisfied())
@@ -451,7 +506,8 @@
451 verificationResult.getSecondaryTrace(),506 verificationResult.getSecondaryTrace(),
452 verificationResult.verificationTime(),507 verificationResult.verificationTime(),
453 verificationResult.stats(),508 verificationResult.stats(),
454 verificationResult.isSolvedUsingStateEquation());509 false,
510 verificationResult.getUnfoldedModel());
455 value.setNameMapping(composedModel.value2());511 value.setNameMapping(composedModel.value2());
456 }512 }
457 else {513 else {
@@ -467,7 +523,8 @@
467 verificationResult.getSecondaryTrace(),523 verificationResult.getSecondaryTrace(),
468 verificationResult.verificationTime(),524 verificationResult.verificationTime(),
469 verificationResult.stats(),525 verificationResult.stats(),
470 verificationResult.isSolvedUsingStateEquation());526 false,
527 verificationResult.getUnfoldedModel());
471 value.setNameMapping(composedModel.value2());528 value.setNameMapping(composedModel.value2());
472 }529 }
473 }530 }
@@ -485,7 +542,8 @@
485 verificationResult.getSecondaryTrace(),542 verificationResult.getSecondaryTrace(),
486 verificationResult.verificationTime(),543 verificationResult.verificationTime(),
487 verificationResult.stats(),544 verificationResult.stats(),
488 verificationResult.isSolvedUsingStateEquation());545 false,
546 verificationResult.getUnfoldedModel());
489 value.setNameMapping(composedModel.value2());547 value.setNameMapping(composedModel.value2());
490 }548 }
491 else {549 else {
@@ -502,7 +560,8 @@
502 verificationResult.getSecondaryTrace(),560 verificationResult.getSecondaryTrace(),
503 verificationResult.verificationTime(),561 verificationResult.verificationTime(),
504 verificationResult.stats(),562 verificationResult.stats(),
505 verificationResult.isSolvedUsingStateEquation());563 false,
564 verificationResult.getUnfoldedModel());
506 value.setNameMapping(composedModel.value2());565 value.setNameMapping(composedModel.value2());
507 566
508 }567 }
@@ -514,14 +573,20 @@
514 // If query does have deadlock -> create trace TAPN573 // If query does have deadlock -> create trace TAPN
515 //Create the verification satisfied result for the approximation574 //Create the verification satisfied result for the approximation
516 VerificationResult<TimedArcPetriNetTrace> approxResult = verificationResult;575 VerificationResult<TimedArcPetriNetTrace> approxResult = verificationResult;
517 valueNetwork = new VerificationResult<TAPNNetworkTrace>(576
518 approxResult.getQueryResult(),577 NameMapping nameMapping = model.network().isColored()? verificationResult.getUnfoldedModel().value2(): composedModel.value2();
519 decomposeTrace(approxResult.getTrace(), composedModel.value2(), model.network()),578 TimedArcPetriNetNetwork netNetwork = model.network().isColored()? verificationResult.getUnfoldedModel().value1().parentNetwork(): model.network();
520 decomposeTrace(approxResult.getSecondaryTrace(), composedModel.value2(), model.network()),579 valueNetwork = new VerificationResult<TAPNNetworkTrace>(
521 approxResult.verificationTime(),580 approxResult.getQueryResult(),
522 approxResult.stats(),581 decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
523 approxResult.isSolvedUsingStateEquation());582 decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
524 valueNetwork.setNameMapping(composedModel.value2());583 approxResult.verificationTime(),
584 approxResult.stats(),
585 false,
586 verificationResult.getUnfoldedModel());
587 valueNetwork.setNameMapping(nameMapping);
588
589
525 590
526 OverApproximation overaprx = new OverApproximation();591 OverApproximation overaprx = new OverApproximation();
527 592
@@ -534,7 +599,7 @@
534 599
535 //run model checker again for trace TAPN600 //run model checker again for trace TAPN
536 MemoryMonitor.cumulateMemory();601 MemoryMonitor.cumulateMemory();
537 verificationResult = modelChecker.verify(options, transformedOriginalModel, clonedQuery);602 verificationResult = modelChecker.verify(options, transformedOriginalModel, clonedQuery, null, query, null);
538603
539 if (verificationResult.error()) {604 if (verificationResult.error()) {
540 options.setTraceOption(oldTraceOption);605 options.setTraceOption(oldTraceOption);
@@ -564,7 +629,8 @@
564 verificationResult.getSecondaryTrace(),629 verificationResult.getSecondaryTrace(),
565 verificationResult.verificationTime() + approxResult.verificationTime(),630 verificationResult.verificationTime() + approxResult.verificationTime(),
566 verificationResult.stats(),631 verificationResult.stats(),
567 verificationResult.isSolvedUsingStateEquation());632 false,
633 verificationResult.getUnfoldedModel());
568 value.setNameMapping(composedModel.value2());634 value.setNameMapping(composedModel.value2());
569 }635 }
570 else {636 else {
@@ -578,7 +644,8 @@
578 verificationResult.getSecondaryTrace(),644 verificationResult.getSecondaryTrace(),
579 verificationResult.verificationTime(),645 verificationResult.verificationTime(),
580 verificationResult.stats(),646 verificationResult.stats(),
581 verificationResult.isSolvedUsingStateEquation());647 false,
648 verificationResult.getUnfoldedModel());
582 value.setNameMapping(composedModel.value2());649 value.setNameMapping(composedModel.value2());
583 }650 }
584 }651 }
@@ -591,7 +658,8 @@
591 verificationResult.getSecondaryTrace(),658 verificationResult.getSecondaryTrace(),
592 verificationResult.verificationTime(),659 verificationResult.verificationTime(),
593 verificationResult.stats(),660 verificationResult.stats(),
594 verificationResult.isSolvedUsingStateEquation());661 false,
662 verificationResult.getUnfoldedModel());
595 value.setNameMapping(composedModel.value2());663 value.setNameMapping(composedModel.value2());
596 }664 }
597 665
598666
=== modified file 'src/main/java/dk/aau/cs/approximation/OverApproximation.java'
--- src/dk/aau/cs/approximation/OverApproximation.java 2020-07-20 12:17:24 +0000
+++ src/main/java/dk/aau/cs/approximation/OverApproximation.java 2022-07-21 13:30:11 +0000
@@ -13,6 +13,7 @@
13import dk.aau.cs.TCTL.TCTLNotNode;13import dk.aau.cs.TCTL.TCTLNotNode;
14import dk.aau.cs.TCTL.TCTLOrListNode;14import dk.aau.cs.TCTL.TCTLOrListNode;
15import dk.aau.cs.TCTL.TCTLPlaceNode;15import dk.aau.cs.TCTL.TCTLPlaceNode;
16import dk.aau.cs.model.CPN.ColorType;
16import dk.aau.cs.model.tapn.*;17import dk.aau.cs.model.tapn.*;
17import dk.aau.cs.model.tapn.simulation.*;18import dk.aau.cs.model.tapn.simulation.*;
18import dk.aau.cs.util.Tuple;19import dk.aau.cs.util.Tuple;
@@ -69,18 +70,18 @@
69 oldInterval.isUpperBoundNonStrict()70 oldInterval.isUpperBoundNonStrict()
70 );71 );
71 }72 }
72 73
73 public void makeTraceTAPN(Tuple<TimedArcPetriNet, NameMapping> transformedModel, VerificationResult<TAPNNetworkTrace> result, dk.aau.cs.model.tapn.TAPNQuery query) {74 public void makeTraceTAPN(Tuple<TimedArcPetriNet, NameMapping> transformedModel, VerificationResult<TAPNNetworkTrace> result, dk.aau.cs.model.tapn.TAPNQuery query) {
74 TimedArcPetriNet net = transformedModel.value1();75 TimedArcPetriNet net = transformedModel.value1();
75 76
76 LocalTimedPlace currentPlace = new LocalTimedPlace("PTRACE0");77 LocalTimedPlace currentPlace = new LocalTimedPlace("PTRACE0");
77 TimedToken currentToken = new TimedToken(currentPlace);78 TimedToken currentToken = new TimedToken(currentPlace, ColorType.COLORTYPE_DOT.getFirstColor());
78 net.add(currentPlace);79 net.add(currentPlace);
79 currentPlace.addToken(currentToken);80 currentPlace.addToken(currentToken);
80 81
81 // Block place, which secures the net makes at most one transition not in the trace.82 // Block place, which secures the net makes at most one transition not in the trace.
82 LocalTimedPlace blockPlace = new LocalTimedPlace("PBLOCK", TimeInvariant.LESS_THAN_INFINITY);83 LocalTimedPlace blockPlace = new LocalTimedPlace("PBLOCK");
83 TimedToken blockToken = new TimedToken(blockPlace);84 TimedToken blockToken = new TimedToken(blockPlace, ColorType.COLORTYPE_DOT.getFirstColor());
84 net.add(blockPlace);85 net.add(blockPlace);
85 blockPlace.addToken(blockToken);86 blockPlace.addToken(blockToken);
86 87
@@ -140,7 +141,7 @@
140 (((TAPNNetworkTimedTransitionStep) step).getTransition().sharedTransition() == null ? tmpStep.getTransition().model().name() : ""), 141 (((TAPNNetworkTimedTransitionStep) step).getTransition().sharedTransition() == null ? tmpStep.getTransition().model().name() : ""),
141 tmpStep.getTransition().name()); 142 tmpStep.getTransition().name());
142 TimedTransition firedTransition = net.getTransitionByName(nameMap.get(key));143 TimedTransition firedTransition = net.getTransitionByName(nameMap.get(key));
143 TimedTransition copyTransition = new TimedTransition(firedTransition.name() + "_traceNet_" + Integer.toString(++transitionInteger), firedTransition.isUrgent());144 TimedTransition copyTransition = new TimedTransition(firedTransition.name() + "_traceNet_" + Integer.toString(++transitionInteger), firedTransition.isUrgent(), null);
144 145
145 net.add(copyTransition);146 net.add(copyTransition);
146 net.add(new TimedInputArc(currentPlace, copyTransition, TimeInterval.ZERO_INF));147 net.add(new TimedInputArc(currentPlace, copyTransition, TimeInterval.ZERO_INF));
@@ -163,17 +164,17 @@
163 164
164 for (TimedInputArc arc : originalInput) {165 for (TimedInputArc arc : originalInput) {
165 if (arc.destination() == firedTransition) {166 if (arc.destination() == firedTransition) {
166 net.add(new TimedInputArc(arc.source(), copyTransition, arc.interval(), arc.getWeight()));167 net.add(new TimedInputArc(arc.source(), copyTransition, arc.interval(), arc.getWeight(), arc.getArcExpression()));
167 }168 }
168 }169 }
169 for (TimedOutputArc arc : originalOutput) {170 for (TimedOutputArc arc : originalOutput) {
170 if (arc.source() == firedTransition) {171 if (arc.source() == firedTransition) {
171 net.add(new TimedOutputArc(copyTransition, arc.destination(), arc.getWeight()));172 net.add(new TimedOutputArc(copyTransition, arc.destination(), arc.getWeight(), arc.getExpression()));
172 }173 }
173 }174 }
174 for (TimedInhibitorArc arc : originalInhibitor) {175 for (TimedInhibitorArc arc : originalInhibitor) {
175 if (arc.destination() == firedTransition) {176 if (arc.destination() == firedTransition) {
176 net.add(new TimedInhibitorArc(arc.source(), copyTransition, arc.interval(), arc.getWeight()));177 net.add(new TimedInhibitorArc(arc.source(), copyTransition, arc.interval(), arc.getWeight(), arc.getArcExpression()));
177 }178 }
178 }179 }
179 for (TransportArc arc : originalTransport) {180 for (TransportArc arc : originalTransport) {
@@ -200,7 +201,7 @@
200 201
201 // An input arc from pBlock to all original transitions makes sure, that we can do deadlock checks.202 // An input arc from pBlock to all original transitions makes sure, that we can do deadlock checks.
202 for (TimedTransition transition : originalTransitions) {203 for (TimedTransition transition : originalTransitions) {
203 net.add(new TimedInputArc(blockPlace, transition, TimeInterval.ZERO_INF)); 204 net.add(new TimedInputArc(blockPlace, transition, TimeInterval.ZERO_INF));
204 } 205 }
205 }206 }
206207
207208
=== modified file 'src/main/java/dk/aau/cs/approximation/UnderApproximation.java'
--- src/dk/aau/cs/approximation/UnderApproximation.java 2020-07-20 12:17:24 +0000
+++ src/main/java/dk/aau/cs/approximation/UnderApproximation.java 2022-07-21 13:30:11 +0000
@@ -1,23 +1,13 @@
1package dk.aau.cs.approximation;1package dk.aau.cs.approximation;
22
3import dk.aau.cs.model.tapn.*;
4import pipe.gui.petrinet.dataLayer.DataLayer;
5import pipe.gui.petrinet.graphicElements.Arc;
6import pipe.gui.petrinet.graphicElements.Place;
7import pipe.gui.petrinet.graphicElements.Transition;
8
3import java.util.ArrayList;9import java.util.ArrayList;
410
5import dk.aau.cs.model.tapn.Bound;
6import dk.aau.cs.model.tapn.IntBound;
7import dk.aau.cs.model.tapn.TimeInterval;
8import dk.aau.cs.model.tapn.TimeInvariant;
9import dk.aau.cs.model.tapn.TimedArcPetriNet;
10import dk.aau.cs.model.tapn.TimedInhibitorArc;
11import dk.aau.cs.model.tapn.TimedInputArc;
12import dk.aau.cs.model.tapn.TimedOutputArc;
13import dk.aau.cs.model.tapn.TimedPlace;
14import dk.aau.cs.model.tapn.TimedTransition;
15import dk.aau.cs.model.tapn.TransportArc;
16import pipe.dataLayer.DataLayer;
17import pipe.gui.graphicElements.Arc;
18import pipe.gui.graphicElements.Place;
19import pipe.gui.graphicElements.Transition;
20
21public class UnderApproximation implements ITAPNApproximation {11public class UnderApproximation implements ITAPNApproximation {
22 @Override12 @Override
23 public void modifyTAPN(TimedArcPetriNet net, int approximationDenominator) {13 public void modifyTAPN(TimedArcPetriNet net, int approximationDenominator) {
@@ -141,44 +131,42 @@
141 }131 }
142 132
143 //Returns a copy of an approximated interval133 //Returns a copy of an approximated interval
144 private TimeInterval modifyIntervals(TimeInterval oldInterval, int denominator){134 private TimeInterval modifyIntervals(TimeInterval oldInterval, int denominator) {
145 Bound newUpperBound;135 Bound newUpperBound;
146 // Do not calculate upper bound for infinite136 // Do not calculate upper bound for infinite
147 if ( ! (oldInterval.upperBound() instanceof Bound.InfBound)) {137 if (!(oldInterval.upperBound() instanceof Bound.InfBound)) {
148 138
149 // Calculate the new upper bound value.139 // Calculate the new upper bound value.
150 int oldUpperBoundValue = oldInterval.upperBound().value();140 int oldUpperBoundValue = oldInterval.upperBound().value();
151 newUpperBound = new IntBound((int) Math.floor((double)oldUpperBoundValue / denominator));141 newUpperBound = new IntBound((int) Math.floor((double) oldUpperBoundValue / denominator));
152 }142 } else {
153 else143 newUpperBound = Bound.Infinity;
154 newUpperBound = Bound.Infinity;144 }
155 145
156 // Calculate the new lower bound146 // Calculate the new lower bound
157 IntBound newLowerBound = new IntBound((int) Math.ceil((double)oldInterval.lowerBound().value() / denominator));147 IntBound newLowerBound = new IntBound((int) Math.ceil((double) oldInterval.lowerBound().value() / denominator));
158 148
159 // if the lower bound has become greater than the upper bound by rounding149 // if the lower bound has become greater than the upper bound by rounding
160 if ( ! (oldInterval.upperBound() instanceof Bound.InfBound) && newLowerBound.value() > newUpperBound.value())150 if (!(oldInterval.upperBound() instanceof Bound.InfBound) && newLowerBound.value() > newUpperBound.value()) {
161 {151 newLowerBound = new IntBound((int) Math.floor((double) oldInterval.lowerBound().value() / denominator));
162 newLowerBound = new IntBound((int) Math.floor((double)oldInterval.lowerBound().value() / denominator));152 newUpperBound = new IntBound((int) Math.floor((double) oldInterval.upperBound().value() / denominator));
163 newUpperBound = new IntBound((int) Math.floor((double)oldInterval.upperBound().value() / denominator));153 }
164 }154
165 155 boolean isLowerBoundNonStrict = oldInterval.isLowerBoundNonStrict();
166 boolean isLowerBoundNonStrict = oldInterval.isLowerBoundNonStrict();156 boolean isUpperBoundNonStrict = oldInterval.isUpperBoundNonStrict();
167 boolean isUpperBoundNonStrict = oldInterval.isUpperBoundNonStrict();157
168 158 // if the interval becomes too small we make it a bit bigger to secure, that we do not have to delete the arc
169 // if the interval becomes too small we make it a bit bigger to secure, that we do not have to delete the arc159 if ((newUpperBound.value() == newLowerBound.value()) && !(oldInterval.isLowerBoundNonStrict() && oldInterval.isUpperBoundNonStrict())) {
170 if ( (newUpperBound.value() == newLowerBound.value()) && !(oldInterval.isLowerBoundNonStrict() && oldInterval.isUpperBoundNonStrict()))160 isUpperBoundNonStrict = true;
171 {161 isLowerBoundNonStrict = true;
172 isUpperBoundNonStrict = true;162 }
173 isLowerBoundNonStrict = true;163
174 }164 return new TimeInterval(
175165 isLowerBoundNonStrict,
176 return new TimeInterval(166 newLowerBound,
177 isLowerBoundNonStrict,167 newUpperBound,
178 newLowerBound,168 isUpperBoundNonStrict
179 newUpperBound,169 );
180 isUpperBoundNonStrict170 }
181 );
182 }
183171
184}172}
185173
=== added file 'src/main/java/dk/aau/cs/io/LoadTACPN.java'
--- src/main/java/dk/aau/cs/io/LoadTACPN.java 1970-01-01 00:00:00 +0000
+++ src/main/java/dk/aau/cs/io/LoadTACPN.java 2022-07-21 13:30:11 +0000
@@ -0,0 +1,439 @@
1package dk.aau.cs.io;
2
3import dk.aau.cs.model.CPN.*;
4import dk.aau.cs.model.CPN.Expressions.*;
5import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;
6import dk.aau.cs.util.FormatException;
7import dk.aau.cs.util.Require;
8import dk.aau.cs.util.Tuple;
9import org.w3c.dom.Element;
10import org.w3c.dom.Node;
11
12import java.util.*;
13
14public class LoadTACPN { //the import feature for CPN and load for TACPN share similarities. These similarities are shared here. Feel free to find a better name for this class
15
16 private final HashMap<String, ColorType> colortypes = new HashMap<>();
17 private final HashMap<String, Variable> variables = new HashMap<>();
18 private final HashMap<String, ColorExpression> tupleVarExpressions = new HashMap<>();
19 private final Collection<String> messages = new ArrayList<>(10);
20
21 public HashMap<String, ColorType> getColortypes() {
22 return colortypes;
23 }
24
25 public HashMap<String, Variable> getVariables() {
26 return variables;
27 }
28
29 public Collection<String> getMessages() {return messages;}
30 //skipWS
31 // Takes a given node and returns it if it is an element,
32 // otherwise returns its first element sibling.
33 // This allows skipping past whitespace nodes.
34 private static Node skipWS(Node node) {
35 if (node != null && !(node instanceof Element)) {
36 return skipWS(node.getNextSibling());
37 } else {
38 return node;
39 }
40 }
41
42 private static Node getAttribute(Node node, String attribute) {
43 return node.getAttributes().getNamedItem(attribute);
44 }
45
46 public void parseDeclarations(Node node, TimedArcPetriNetNetwork network) throws FormatException {
47 if(!(node instanceof Element)){
48 return;
49 }
50 Node child = skipWS(node.getFirstChild());
51 while(child != null){
52 String childName = child.getNodeName();
53 if (childName.equals("namedsort")){
54 parseNamedSort(child, network);
55 } else if (childName.equals("variabledecl")){
56 String id = getAttribute(child, "id").getNodeValue();
57 String name = getAttribute(child, "name").getNodeValue();
58 ColorType ct = parseUserSort(child);
59 Variable var = new Variable(name, id, ct);
60 Require.that(variables.put(id, var) == null, "the id " + id + ", was already used");
61 network.add(var);
62 } else {
63 parseDeclarations(child, network);
64 }
65
66 child = skipWS(child.getNextSibling());
67 }
68 Vector<String> variablesForRemoval = new Vector<>();
69 HashMap<String, Variable> newVars = new HashMap<>();
70 StringBuilder renameWarnings = new StringBuilder();
71 // Convert product variables into variables for the constituent of the product
72 for(String varName : variables.keySet()){
73 Variable var = variables.get(varName);
74 if(var.getColorType().isProductColorType()){
75 int constituentCounter = 1;
76
77 Vector<ColorExpression> constituentVarExpressions = new Vector<>();
78 renameWarnings.append("The product variable ").append(var.getName()).append(", was unfolded to (");
79
80 for(ColorType colorType : var.getColorType().getProductColorTypes()){
81 StringBuilder elementSubstring = new StringBuilder("_" + constituentCounter);
82 while (variables.containsKey(varName + elementSubstring) || newVars.containsKey(varName + elementSubstring)){
83 elementSubstring.append("_1");
84 }
85
86 renameWarnings.append(varName).append(elementSubstring).append(",");
87
88 Variable newVar = new Variable(var.getName() + elementSubstring, varName + elementSubstring, colorType);
89 Require.that(newVars.put(varName + elementSubstring, newVar) == null, "the id " + varName + elementSubstring + ", was already used");
90 network.add(newVar);
91 constituentVarExpressions.addElement(new VariableExpression(newVar));
92 constituentCounter++;
93 }
94 renameWarnings.deleteCharAt(renameWarnings.length()-1);
95 renameWarnings.append(")\n");
96
97 tupleVarExpressions.put(varName, new TupleExpression(constituentVarExpressions));
98 network.remove(var);
99 variablesForRemoval.addElement(varName);
100 }
101 }
102 for(String varName : variablesForRemoval){
103 variables.remove(varName);
104 }
105 for(String varName : newVars.keySet()){
106 variables.put(varName, newVars.get(varName));
107 }
108
109 if(renameWarnings.length() > 0){
110 messages.add(renameWarnings.toString());
111 //JOptionPane.showConfirmDialog(CreateGui.getApp(), renameWarnings.toString(), "Product Variables unfolded", JOptionPane.OK_OPTION, JOptionPane.WARNING_MESSAGE);
112 }
113 }
114 private void parseNamedSort(Node node, TimedArcPetriNetNetwork network) throws FormatException {
115 //We always use the dot colortype
116 colortypes.put("dot", ColorType.COLORTYPE_DOT);
117 network.add(ColorType.COLORTYPE_DOT);
118
119 Node type = skipWS(node.getFirstChild());
120 String typetag = type.getNodeName();
121 String name = getAttribute(node, "name").getNodeValue();
122 String id = getAttribute(node, "id").getNodeValue();
123
124 if (typetag.equals("productsort")) {
125 ProductType pt = new ProductType(name);
126 Node typechild = skipWS(type.getFirstChild());
127 while (typechild != null) {
128 if (typechild.getNodeName().equals("usersort")) {
129 String constituent = getAttribute(typechild, "declaration").getNodeValue();
130 pt.addType(colortypes.get(constituent));
131 }
132 typechild = skipWS(typechild.getNextSibling());
133 }
134 Require.that(colortypes.put(id, pt) == null, "the name " + id + ", was already used");
135 network.add(pt);
136 } else {
137 ColorType ct = new ColorType(name, id);
138 if (typetag.equals("dot")) {
139 return;
140 } else if (typetag.equals("finiteintrange")){
141 int start = Integer.parseInt(getAttribute(type, "start").getNodeValue());
142 int end = Integer.parseInt(getAttribute(type, "end").getNodeValue());
143 for(int i = start; i <= end; i++){
144 ct.addColor(String.valueOf(i));
145 }
146 } else {
147 Node typechild = skipWS(type.getFirstChild());
148 while (typechild != null) {
149 Node colorId = getAttribute(typechild, "id");
150 if (colorId != null) {
151 ct.addColor(colorId.getNodeValue());
152 typechild = skipWS(typechild.getNextSibling());
153 } else {
154 throw new FormatException(String.format("No id found on %s\n", typechild.getNodeName()));
155 }
156 }
157 }
158 Require.that(colortypes.put(id, ct) == null, "the name " + id + ", was already used");
159 network.add(ct);
160 }
161 }
162
163 public ColorType parseUserSort(Node node) throws FormatException {
164 if (node instanceof Element) {
165 Node child = skipWS(node.getFirstChild());
166 while (child != null) {
167 String name = child.getNodeName();
168 if (name.equals("usersort")) {
169 Node decl = getAttribute(child, "declaration");
170 return colortypes.get(decl.getNodeValue());
171 } else if (name.matches("structure|type|subterm")) {
172 return parseUserSort(child);
173 }
174 child = skipWS(child.getNextSibling());
175 }
176 }
177 throw new FormatException(String.format("Could not parse %s as an usersort\n", node.getNodeName()));
178 }
179
180 public ArcExpression parseArcExpression(Node node) throws FormatException {
181 String name = node.getNodeName();
182 if (name.equals("numberof")) {
183 return parseNumberOfExpression(node);
184 } else if (name.equals("add")) {
185 Vector<ArcExpression> constituents = new Vector<>();
186
187 Node child = skipWS(node.getFirstChild());
188 while (child != null) {
189 ArcExpression subterm = parseArcExpression(child);
190 constituents.add(subterm);
191 child = skipWS(child.getNextSibling());
192 }
193 return new AddExpression(constituents);
194 } else if (name.equals("subtract")) {
195 Node headchild = skipWS(node.getFirstChild());
196 ArcExpression headexp = parseArcExpression(headchild);
197
198 Node nextchild = skipWS(headchild.getNextSibling());
199 while (nextchild != null) {
200 ArcExpression nextexp = parseArcExpression(nextchild);
201 headexp = new SubtractExpression(headexp, nextexp);
202 nextchild = skipWS(nextchild.getNextSibling());
203 }
204 return headexp;
205 } else if (name.equals("scalarproduct")) {
206 Node scalar = skipWS(node.getFirstChild());
207 Integer scalarval = parseNumberConstantExpression(scalar);
208
209 Node child = skipWS(scalar.getNextSibling());
210 ArcExpression childexp = parseArcExpression(child);
211
212 return new ScalarProductExpression(scalarval, childexp);
213 }else if (name.equals("all")){
214 ColorType ct = parseUserSort(node);
215 Vector<ColorExpression> ceVector = new Vector<>();
216 ceVector.add(new AllExpression(ct));
217 return new NumberOfExpression(1,ceVector);
218
219 } else if (name.matches("subterm|structure")) {
220 Node child = skipWS(node.getFirstChild());
221 return parseArcExpression(child);
222 } else if (name.matches("tuple")){
223 Vector<ColorExpression> ceVector = new Vector<>();
224 ceVector.add(parseColorExpression(node));
225 return new NumberOfExpression(1, ceVector);
226 } else{
227 throw new FormatException(String.format("Could not parse %s as an arc expression\n", name));
228 }
229 }
230
231 private NumberOfExpression parseNumberOfExpression(Node node) throws FormatException {
232 Node number = skipWS(node.getFirstChild());
233 //The number constant may be omitted.
234 //In that case, this parsing returns null.
235 Integer numberval = parseNumberConstantExpression(number);
236 Node subnode;
237 if (numberval != null) {
238 //The subexpression comes after the number constant.
239 subnode = skipWS(number.getNextSibling());
240 } else {
241 //The number we read was actually the subexpression.
242 subnode = number;
243 numberval = 1;
244 }
245 Vector<ColorExpression> colorexps = new Vector<>();
246 while (subnode != null) {
247 ColorExpression colorexp = parseColorExpression(subnode);
248 colorexps.add(colorexp);
249 subnode = skipWS(subnode.getNextSibling());
250 }
251 return new NumberOfExpression(numberval, colorexps);
252
253 }
254
255 private Integer parseNumberConstantExpression(Node node) {
256 String name = node.getNodeName();
257 if (name.equals("numberconstant")) {
258 String value = getAttribute(node, "value").getNodeValue();
259 return Integer.valueOf(value);
260 } else if (name.equals("subterm")) {
261 Node child = skipWS(node.getFirstChild());
262 return parseNumberConstantExpression(child);
263 } else {
264 return null;
265 }
266 }
267
268 private ColorExpression parseColorExpression(Node node) throws FormatException {
269 String name = node.getNodeName();
270 if (name.equals("dotconstant")) {
271 return new DotConstantExpression();
272 } else if (name.equals("variable")) {
273 String varname = getAttribute(node, "refvariable").getNodeValue();
274 Variable var = variables.get(varname);
275 if(var != null){
276 return new VariableExpression(var);
277 } else {
278 return tupleVarExpressions.get(varname);
279 }
280 } else if (name.equals("useroperator")) {
281 String colorname = getAttribute(node, "declaration").getNodeValue();
282 Color color = getColor(colorname);
283 return new UserOperatorExpression(color);
284 } else if (name.equals("successor")) {
285 Node child = skipWS(node.getFirstChild());
286 ColorExpression childexp = parseColorExpression(child);
287 return new SuccessorExpression(childexp);
288 } else if (name.equals("predecessor")) {
289 Node child = skipWS(node.getFirstChild());
290 ColorExpression childexp = parseColorExpression(child);
291 return new PredecessorExpression(childexp);
292 } else if(name.equals("all")){
293 ColorType ct = parseUserSort(node);
294 return new AllExpression(ct);
295 } else if (name.equals("tuple")) {
296 Vector<ColorExpression> colorexps = new Vector<>();
297
298 Node child = skipWS(node.getFirstChild());
299 while (child != null) {
300 ColorExpression colorexp = parseColorExpression(child);
301 colorexps.add(colorexp);
302 child = skipWS(child.getNextSibling());
303 }
304 //Sometimes PNML nets have tuples with only 1 color, we just remove the tuple
305 if(colorexps.size() < 2){
306 return colorexps.get(0);
307 }
308 return new TupleExpression(colorexps);
309 } else if (name.matches("subterm|structure")) {
310 Node child = skipWS(node.getFirstChild());
311 return parseColorExpression(child);
312 } else if (name.equals("finiteintrangeconstant")){
313 String value = getAttribute(node, "value").getNodeValue();
314 //we assume first child is finiteintrange
315 Node intRangeElement = skipWS(node.getFirstChild());
316 String start = getAttribute(intRangeElement, "start").getNodeValue();
317 String end = getAttribute(intRangeElement, "end").getNodeValue();
318 return new UserOperatorExpression(findColorForIntRange(value,start,end));
319
320 } else {
321 throw new FormatException(String.format("Could not parse %s as an color expression\n", name));
322 }
323 }
324
325 /// This will select the wrong color if the is overlap in naming, eg for IntegerRangeExpr (1,2,3,4) & (1,2)
326 private dk.aau.cs.model.CPN.Color getColor(String colorname) throws FormatException {
327 for (ColorType ct : colortypes.values()) {
328 for (dk.aau.cs.model.CPN.Color c : ct) {
329 if (c.getName().equals(colorname)) {
330 return c;
331 }
332 }
333 }
334 throw new FormatException(String.format("The color \"%s\" was not declared\n", colorname));
335 }
336
337 public GuardExpression parseGuardExpression(Node node) throws FormatException {
338 String name = node.getNodeName();
339 if (name.matches("lt|lessthan")) {
340 Tuple<ColorExpression, ColorExpression> subexps = parseLRColorExpressions(node);
341 return new LessThanExpression(subexps.value1(), subexps.value2());
342 } else if (name.matches("gt|greaterthan")) {
343 Tuple<ColorExpression, ColorExpression> subexps = parseLRColorExpressions(node);
344 return new GreaterThanExpression(subexps.value1(), subexps.value2());
345 } else if (name.matches("leq|lessthanorequal")) {
346 Tuple<ColorExpression, ColorExpression> subexps = parseLRColorExpressions(node);
347 return new LessThanEqExpression(subexps.value1(), subexps.value2());
348 } else if (name.matches("geq|greaterthanorequal")) {
349 Tuple<ColorExpression, ColorExpression> subexps = parseLRColorExpressions(node);
350 return new GreaterThanEqExpression(subexps.value1(), subexps.value2());
351 } else if (name.matches("eq|equality")) {
352 Tuple<ColorExpression, ColorExpression> subexps = parseLRColorExpressions(node);
353 return new EqualityExpression(subexps.value1(), subexps.value2());
354 } else if (name.matches("neq|inequality")) {
355 Tuple<ColorExpression, ColorExpression> subexps = parseLRColorExpressions(node);
356 return new InequalityExpression(subexps.value1(), subexps.value2());
357 } else if (name.equals("not")) {
358 Node child = skipWS(node.getFirstChild());
359 GuardExpression childexp = parseGuardExpression(child);
360 return new NotExpression(childexp);
361 } else if (name.equals("and")) {
362 Tuple<GuardExpression, GuardExpression> subexps = parseLRGuardExpressions(node);
363 return new AndExpression(subexps.value1(), subexps.value2());
364 } else if (name.equals("or")) {
365 Node left = skipWS(node.getFirstChild());
366 Node right = skipWS(left.getNextSibling());
367 if(right == null){
368 return parseGuardExpression(left);
369 }
370 GuardExpression parentOr = new OrExpression(parseGuardExpression(left), parseGuardExpression(right));
371 for (var it = skipWS(right.getNextSibling()); it != null; it = skipWS(it.getNextSibling())){
372 parentOr = new OrExpression(parentOr, parseGuardExpression(it));
373 }
374 return parentOr;
375 } else if (name.matches("subterm|structure")) {
376 Node child = skipWS(node.getFirstChild());
377 return parseGuardExpression(child);
378 } else {
379 throw new FormatException(String.format("Could not parse %s as a guard expression\n", name));
380 }
381 }
382
383 private Tuple<ColorExpression,ColorExpression> parseLRColorExpressions(Node node) throws FormatException {
384 Node left = skipWS(node.getFirstChild());
385 ColorExpression leftexp = parseColorExpression(left);
386 Node right = skipWS(left.getNextSibling());
387 ColorExpression rightexp = parseColorExpression(right);
388 return new Tuple<>(leftexp, rightexp);
389 }
390
391 private Tuple<GuardExpression,GuardExpression> parseLRGuardExpressions(Node node) throws FormatException {
392 Node left = skipWS(node.getFirstChild());
393 GuardExpression leftexp = parseGuardExpression(left);
394 Node right = skipWS(left.getNextSibling());
395 GuardExpression rightexp = parseGuardExpression(right);
396 return new Tuple<>(leftexp, rightexp);
397 }
398
399 Color findColorForIntRange(String value, String start, String end) throws FormatException {
400 for(var ct : colortypes.values()){
401 if(ct.getColors().get(0).getColorName().equals(start) && ct.getColors().get(ct.getColors().size()-1).getColorName().equals(end)){
402 for (dk.aau.cs.model.CPN.Color c : ct) {
403 if (c.getName().equals(value)) {
404 return c;
405 }
406 }
407 }
408 }
409 throw new FormatException(String.format("The color \"%s\" was not declared in an int range\n", value));
410 }
411
412 public AddExpression constructCleanAddExpression(ColorType ct, ColorMultiset multiset){
413 Vector<ArcExpression> coloredTokenList = new Vector<>();
414
415 for(Color c : ct.getColors()){
416 int numberOf = multiset.get(c);
417 if(numberOf < 1){
418 continue;
419 }
420 Vector<ColorExpression> v = new Vector<>();
421 if(ct.isProductColorType()){
422 Vector<ColorExpression> tupleColors = new Vector<>();
423 for(Color tupleCol : c.getTuple()){
424 UserOperatorExpression color = new UserOperatorExpression(tupleCol);
425 tupleColors.add(color);
426 }
427 TupleExpression tupleExpr = new TupleExpression(tupleColors);
428 v.add(tupleExpr);
429 } else {
430 UserOperatorExpression color = new UserOperatorExpression(c);
431 v.add(color);
432 }
433 NumberOfExpression numOf = new NumberOfExpression(numberOf,v);
434 coloredTokenList.add(numOf);
435
436 }
437 return new AddExpression(coloredTokenList);
438 }
439}
0440
=== modified file 'src/main/java/dk/aau/cs/io/LoadedModel.java'
--- src/dk/aau/cs/io/LoadedModel.java 2020-08-26 12:29:25 +0000
+++ src/main/java/dk/aau/cs/io/LoadedModel.java 2022-07-21 13:30:11 +0000
@@ -1,12 +1,11 @@
1package dk.aau.cs.io;1package dk.aau.cs.io;
22
3import java.util.Collection;3import java.util.Collection;
4import java.util.List;
54
6import dk.aau.cs.gui.TabContent;5import net.tapaal.gui.petrinet.TAPNLens;
7import dk.aau.cs.io.batchProcessing.LoadedBatchProcessingModel;6import dk.aau.cs.io.batchProcessing.LoadedBatchProcessingModel;
8import pipe.dataLayer.TAPNQuery;7import net.tapaal.gui.petrinet.verification.TAPNQuery;
9import pipe.dataLayer.Template;8import net.tapaal.gui.petrinet.Template;
10import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;9import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;
1110
12public class LoadedModel implements LoadedBatchProcessingModel {11public class LoadedModel implements LoadedBatchProcessingModel {
@@ -15,9 +14,9 @@
15 private final Collection<TAPNQuery> queries;14 private final Collection<TAPNQuery> queries;
16 private final TimedArcPetriNetNetwork network;15 private final TimedArcPetriNetNetwork network;
17 private final Collection<String> messages;16 private final Collection<String> messages;
18 private final TabContent.TAPNLens lens;17 private final TAPNLens lens;
1918
20 public LoadedModel(TimedArcPetriNetNetwork network, Collection<Template> templates, Collection<TAPNQuery> queries, Collection<String> messages, TabContent.TAPNLens lens){19 public LoadedModel(TimedArcPetriNetNetwork network, Collection<Template> templates, Collection<TAPNQuery> queries, Collection<String> messages, TAPNLens lens){
21 this.templates = templates;20 this.templates = templates;
22 this.network = network;21 this.network = network;
23 this.queries = queries;22 this.queries = queries;
@@ -30,15 +29,18 @@
30 public TimedArcPetriNetNetwork network(){ return network; }29 public TimedArcPetriNetNetwork network(){ return network; }
31 public Collection<String> getMessages() { return messages; }30 public Collection<String> getMessages() { return messages; }
3231
33 public TabContent.TAPNLens getLens(){32 public TAPNLens getLens(){
34 if (lens != null) {33 if (lens != null) {
35 return lens;34 return lens;
36 } else {35 } else {
37 boolean isNetTimed = !network().isUntimed();36 boolean isNetTimed = !network().isUntimed();
38 boolean isNetGame = network().hasUncontrollableTransitions();37 boolean isNetGame = network().hasUncontrollableTransitions();
38 boolean isNetColored = network.isColored();
3939
40 return new TabContent.TAPNLens(isNetTimed, isNetGame);40 return new TAPNLens(isNetTimed, isNetGame, isNetColored);
41 }41 }
42 }42 }
4343 public boolean isColored(){
44 return lens.isColored();
45 }
44}46}
45\ No newline at end of file47\ No newline at end of file
4648
=== modified file 'src/main/java/dk/aau/cs/io/LoadedQueries.java'
--- src/dk/aau/cs/io/LoadedQueries.java 2020-10-09 07:59:49 +0000
+++ src/main/java/dk/aau/cs/io/LoadedQueries.java 2022-07-21 13:30:11 +0000
@@ -1,6 +1,5 @@
1package dk.aau.cs.io;1package dk.aau.cs.io;
2import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;2import net.tapaal.gui.petrinet.verification.TAPNQuery;
3import pipe.dataLayer.TAPNQuery;
4import java.util.Collection;3import java.util.Collection;
54
6public class LoadedQueries {5public class LoadedQueries {
76
=== modified file 'src/main/java/dk/aau/cs/io/ModelLoader.java'
--- src/dk/aau/cs/io/ModelLoader.java 2021-08-10 11:37:11 +0000
+++ src/main/java/dk/aau/cs/io/ModelLoader.java 2022-07-21 13:30:11 +0000
@@ -7,7 +7,7 @@
7import java.io.InputStream;7import java.io.InputStream;
88
9import dk.aau.cs.TCTL.Parsing.ParseException;9import dk.aau.cs.TCTL.Parsing.ParseException;
10import dk.aau.cs.gui.TabContent;10import net.tapaal.gui.petrinet.TAPNLens;
1111
12public class ModelLoader {12public class ModelLoader {
1313
@@ -52,12 +52,12 @@
52 return oldFormatLoader.load(new ByteArrayInputStream(baos.toByteArray()));52 return oldFormatLoader.load(new ByteArrayInputStream(baos.toByteArray()));
5353
54 } catch(Throwable e2) {54 } catch(Throwable e2) {
55 throw new ParseException(e1.getMessage());55 throw new Exception(e1.getMessage(), e1);
56 }56 }
57 }57 }
58 }58 }
5959
60 public TabContent.TAPNLens loadLens(InputStream file) throws Exception{60 public TAPNLens loadLens(InputStream file) throws Exception{
61 TapnXmlLoader newFormatLoader = new TapnXmlLoader();61 TapnXmlLoader newFormatLoader = new TapnXmlLoader();
62 ByteArrayOutputStream baos = new ByteArrayOutputStream();62 ByteArrayOutputStream baos = new ByteArrayOutputStream();
63 byte[] buffer = new byte[1024];63 byte[] buffer = new byte[1024];
6464
=== renamed file 'src/pipe/dataLayer/NetWriter.java' => 'src/main/java/dk/aau/cs/io/NetWriter.java'
--- src/pipe/dataLayer/NetWriter.java 2014-05-22 21:26:05 +0000
+++ src/main/java/dk/aau/cs/io/NetWriter.java 2022-07-21 13:30:11 +0000
@@ -1,4 +1,4 @@
1package pipe.dataLayer;1package dk.aau.cs.io;
22
3import java.io.ByteArrayOutputStream;3import java.io.ByteArrayOutputStream;
4import java.io.File;4import java.io.File;
@@ -12,7 +12,7 @@
12public interface NetWriter {12public interface NetWriter {
13 void savePNML(File file) throws NullPointerException, IOException,13 void savePNML(File file) throws NullPointerException, IOException,
14 ParserConfigurationException, DOMException,14 ParserConfigurationException, DOMException,
15 TransformerConfigurationException, TransformerException;15 TransformerException;
1616
17 ByteArrayOutputStream savePNML() throws IOException, ParserConfigurationException, DOMException, TransformerConfigurationException, TransformerException;17 ByteArrayOutputStream savePNML() throws IOException, ParserConfigurationException, DOMException, TransformerException;
18}18}
1919
=== modified file 'src/main/java/dk/aau/cs/io/PNMLWriter.java'
--- src/dk/aau/cs/io/PNMLWriter.java 2020-07-13 13:58:47 +0000
+++ src/main/java/dk/aau/cs/io/PNMLWriter.java 2022-07-21 13:30:11 +0000
@@ -17,20 +17,20 @@
17import javax.xml.transform.dom.DOMSource;17import javax.xml.transform.dom.DOMSource;
18import javax.xml.transform.stream.StreamResult;18import javax.xml.transform.stream.StreamResult;
1919
20import net.tapaal.gui.petrinet.TAPNLens;
20import org.w3c.dom.DOMException;21import org.w3c.dom.DOMException;
21import org.w3c.dom.Document;22import org.w3c.dom.Document;
22import org.w3c.dom.Element;23import org.w3c.dom.Element;
2324
24import pipe.dataLayer.DataLayer;25import pipe.gui.petrinet.dataLayer.DataLayer;
25import pipe.dataLayer.NetWriter;
26import pipe.gui.MessengerImpl;26import pipe.gui.MessengerImpl;
27import pipe.gui.graphicElements.Arc;27import pipe.gui.petrinet.graphicElements.Arc;
28import pipe.gui.graphicElements.Place;28import pipe.gui.petrinet.graphicElements.Place;
29import pipe.gui.graphicElements.Transition;29import pipe.gui.petrinet.graphicElements.Transition;
30import pipe.gui.graphicElements.tapn.TimedInhibitorArcComponent;30import pipe.gui.petrinet.graphicElements.tapn.TimedInhibitorArcComponent;
31import pipe.gui.graphicElements.tapn.TimedOutputArcComponent;31import pipe.gui.petrinet.graphicElements.tapn.TimedOutputArcComponent;
32import pipe.gui.graphicElements.tapn.TimedPlaceComponent;32import pipe.gui.petrinet.graphicElements.tapn.TimedPlaceComponent;
33import pipe.gui.graphicElements.tapn.TimedTransitionComponent;33import pipe.gui.petrinet.graphicElements.tapn.TimedTransitionComponent;
34import dk.aau.cs.model.tapn.TimedArcPetriNet;34import dk.aau.cs.model.tapn.TimedArcPetriNet;
35import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;35import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;
36import dk.aau.cs.util.Require;36import dk.aau.cs.util.Require;
@@ -41,19 +41,21 @@
41 private final TimedArcPetriNetNetwork network;41 private final TimedArcPetriNetNetwork network;
42 private TimedArcPetriNet composedNetwork;42 private TimedArcPetriNet composedNetwork;
43 private final HashMap<TimedArcPetriNet, DataLayer> guiModels;43 private final HashMap<TimedArcPetriNet, DataLayer> guiModels;
44 private final TAPNLens lens;
45 private final writeTACPN writeTACPN;
4446
45 public PNMLWriter(47 public PNMLWriter(TimedArcPetriNetNetwork network, HashMap<TimedArcPetriNet, DataLayer> guiModels, TAPNLens lens) {
46 TimedArcPetriNetNetwork network,
47 HashMap<TimedArcPetriNet, DataLayer> guiModels) {
48 this.network = network;48 this.network = network;
49 this.guiModels = guiModels;49 this.guiModels = guiModels;
50 this.lens = lens;
51 writeTACPN = new writeTACPN(network);
50 }52 }
51 53
52 public ByteArrayOutputStream savePNML() throws IOException, ParserConfigurationException, DOMException, TransformerConfigurationException, TransformerException {54 public ByteArrayOutputStream savePNML() throws ParserConfigurationException, DOMException, TransformerException {
53 Document document = null;55 Document document = null;
54 Transformer transformer = null;56 Transformer transformer = null;
55 ByteArrayOutputStream os = new ByteArrayOutputStream();57 ByteArrayOutputStream os = new ByteArrayOutputStream();
56 TAPNComposer composer = new TAPNComposer(new MessengerImpl(), guiModels, true, true);58 TAPNComposer composer = new TAPNComposer(new MessengerImpl(), guiModels, lens, true, true);
57 composedNetwork = composer.transformModel(network).value1();59 composedNetwork = composer.transformModel(network).value1();
58 60
59 // Build a Petri Net XML Document61 // Build a Petri Net XML Document
@@ -69,17 +71,21 @@
69 pnmlRootNode.appendChild(netNode);71 pnmlRootNode.appendChild(netNode);
70 netNode.setAttribute("id", composedNetwork.name());72 netNode.setAttribute("id", composedNetwork.name());
71 netNode.setAttribute("type", "http://www.pnml.org/version-2009/grammar/ptnet");73 netNode.setAttribute("type", "http://www.pnml.org/version-2009/grammar/ptnet");
72 74
75 Element nameNode = document.createElement("name"); //Name of the net
76 netNode.appendChild(nameNode);
77 Element nameText = document.createElement("text");
78 nameNode.appendChild(nameText);
79 nameText.setTextContent(composedNetwork.name());
80
81 if(lens.isColored()) {
82 writeTACPN.appendDeclarations(document, netNode);
83 }
84
73 Element pageNode = document.createElement("page"); //Page node85 Element pageNode = document.createElement("page"); //Page node
74 netNode.appendChild(pageNode);86 netNode.appendChild(pageNode);
75 pageNode.setAttribute("id", "page0");87 pageNode.setAttribute("id", "page0");
76 88
77 Element nameNode = document.createElement("name"); //Name of the net
78 netNode.appendChild(nameNode);
79 Element nameText = document.createElement("text");
80 nameNode.appendChild(nameText);
81 nameText.setTextContent(composedNetwork.name());
82
83 appendPlaces(document, composer.getGuiModel(), pageNode);89 appendPlaces(document, composer.getGuiModel(), pageNode);
84 appendTransitions(document, composer.getGuiModel(), pageNode);90 appendTransitions(document, composer.getGuiModel(), pageNode);
85 appendArcs(document, composer.getGuiModel(), pageNode);91 appendArcs(document, composer.getGuiModel(), pageNode);
@@ -96,7 +102,7 @@
96 return os;102 return os;
97 }103 }
98104
99 public void savePNML(File file) throws IOException, ParserConfigurationException, DOMException, TransformerConfigurationException, TransformerException {105 public void savePNML(File file) throws IOException, ParserConfigurationException, DOMException, TransformerException {
100 Require.that(file != null, "Error: file to save to was null");106 Require.that(file != null, "Error: file to save to was null");
101 107
102 try {108 try {
@@ -130,21 +136,36 @@
130 private void appendPlaces(Document document, DataLayer guiModel, Element NET) {136 private void appendPlaces(Document document, DataLayer guiModel, Element NET) {
131 Place[] places = guiModel.getPlaces();137 Place[] places = guiModel.getPlaces();
132 for (Place place : places) {138 for (Place place : places) {
133 NET.appendChild(createPlaceElement((TimedPlaceComponent) place, guiModel, document));139 if (lens.isColored()){
140 NET.appendChild(createColorPlaceElement((TimedPlaceComponent) place, guiModel, document));
141 }
142 else {
143 NET.appendChild(createPlaceElement((TimedPlaceComponent) place, guiModel, document));
144 }
134 }145 }
135 }146 }
136147
137 private void appendTransitions(Document document, DataLayer guiModel, Element NET) {148 private void appendTransitions(Document document, DataLayer guiModel, Element NET) {
138 Transition[] transitions = guiModel.getTransitions();149 Transition[] transitions = guiModel.getTransitions();
139 for (Transition transition : transitions) {150 for (Transition transition : transitions) {
140 NET.appendChild(createTransitionElement((TimedTransitionComponent) transition, document));151 if(lens.isColored()) {
152 NET.appendChild(createColoredTransitionElement((TimedTransitionComponent) transition, document));
153 }
154 else {
155 NET.appendChild(createTransitionElement((TimedTransitionComponent) transition, document));
156 }
141 }157 }
142 }158 }
143 159
144 private void appendArcs(Document document, DataLayer guiModel, Element NET) {160 private void appendArcs(Document document, DataLayer guiModel, Element NET) {
145 Arc[] arcs = guiModel.getArcs();161 Arc[] arcs = guiModel.getArcs();
146 for (Arc arc : arcs) {162 for (Arc arc : arcs) {
147 NET.appendChild(createArcElement(arc, guiModel, document));163 if(lens.isColored()) {
164 NET.appendChild(createColoredArcElement(arc,guiModel , document));
165 }
166 else {
167 NET.appendChild(createArcElement(arc, guiModel, document));
168 }
148 }169 }
149 }170 }
150171
@@ -188,6 +209,38 @@
188 return placeElement;209 return placeElement;
189 }210 }
190211
212 private Element createColorPlaceElement(TimedPlaceComponent inputPlace, DataLayer guiModel, Document document) {
213 Require.that(inputPlace != null, "Error: inputPlace was null");
214 Require.that(guiModel != null, "Error: guiModel was null");
215 Require.that(document != null, "Error: document was null");
216
217 Element placeElement = document.createElement("place");
218 placeElement.setAttribute("id", (inputPlace.getId() != null ? inputPlace.getId() : inputPlace.getName()));
219
220
221 Element name = document.createElement("name"); //Name
222 placeElement.appendChild(name);
223 Element nameText = document.createElement("text");
224 name.appendChild(nameText);
225 nameText.setTextContent(inputPlace.underlyingPlace().name());
226 Element nameGraphics = document.createElement("graphics");
227 name.appendChild(nameGraphics);
228 Element nameOffset = document.createElement("offset");
229 nameGraphics.appendChild(nameOffset);
230 nameOffset.setAttribute("x", String.valueOf(Math.round(inputPlace.getNameOffsetX())));
231 nameOffset.setAttribute("y", String.valueOf(Math.round(inputPlace.getNameOffsetY())));
232
233 Element graphics = document.createElement("graphics");
234 placeElement.appendChild(graphics);
235 Element offset = document.createElement("position");
236 graphics.appendChild(offset);
237 offset.setAttribute("x", String.valueOf(Math.round(inputPlace.getPositionX())));
238 offset.setAttribute("y", String.valueOf(Math.round(inputPlace.getPositionY())));
239
240 writeTACPN.appendColoredPlaceDependencies(inputPlace.underlyingPlace(), document, placeElement);
241 return placeElement;
242 }
243
191 private Element createTransitionElement(TimedTransitionComponent inputTransition, Document document) {244 private Element createTransitionElement(TimedTransitionComponent inputTransition, Document document) {
192 Require.that(inputTransition != null, "Error: inputTransition was null");245 Require.that(inputTransition != null, "Error: inputTransition was null");
193 Require.that(document != null, "Error: document was null");246 Require.that(document != null, "Error: document was null");
@@ -217,6 +270,36 @@
217 return transitionElement;270 return transitionElement;
218 }271 }
219272
273 private Element createColoredTransitionElement (TimedTransitionComponent inputTransition, Document document) {
274 Require.that(inputTransition != null, "Error: inputTransition was null");
275 Require.that(document != null, "Error: document was null");
276
277 Element transitionElement = document.createElement("transition");
278 transitionElement.setAttribute("id", (inputTransition.getId() != null ? inputTransition.getId() : "error"));
279
280 Element name = document.createElement("name"); //Name
281 transitionElement.appendChild(name);
282 Element nameGraphics = document.createElement("graphics");
283 name.appendChild(nameGraphics);
284 Element nameOffset = document.createElement("offset");
285 nameGraphics.appendChild(nameOffset);
286 nameOffset.setAttribute("x", String.valueOf(Math.round(inputTransition.getNameOffsetX())));
287 nameOffset.setAttribute("y", String.valueOf(Math.round(inputTransition.getNameOffsetY())));
288 Element nameText = document.createElement("text");
289 name.appendChild(nameText);
290 nameText.setTextContent(inputTransition.underlyingTransition().name());
291
292 Element graphics = document.createElement("graphics");
293 transitionElement.appendChild(graphics);
294 Element offset = document.createElement("position");
295 graphics.appendChild(offset);
296 offset.setAttribute("x", String.valueOf(Math.round(inputTransition.getPositionX())));
297 offset.setAttribute("y", String.valueOf(Math.round(inputTransition.getPositionY())));
298
299 writeTACPN.appendColoredTransitionDependencies(inputTransition.underlyingTransition(), document, transitionElement);
300 return transitionElement;
301 }
302
220 private Element createArcElement(Arc arc, DataLayer guiModel, Document document) {303 private Element createArcElement(Arc arc, DataLayer guiModel, Document document) {
221 Require.that(arc != null, "Error: inputArc was null");304 Require.that(arc != null, "Error: inputArc was null");
222 Require.that(guiModel != null, "Error: guiModel was null");305 Require.that(guiModel != null, "Error: guiModel was null");
@@ -258,6 +341,47 @@
258 341
259 return arcElement;342 return arcElement;
260 }343 }
344
345 private Element createColoredArcElement(Arc arc, DataLayer guiModel, Document document) {
346 Require.that(arc != null, "Error: inputArc was null");
347 Require.that(guiModel != null, "Error: guiModel was null");
348 Require.that(document != null, "Error: document was null");
349
350 Element arcElement = document.createElement("arc");
351 arcElement.setAttribute("id", (arc.getId() != null ? arc.getId() : "error"));
352 arcElement.setAttribute("source", (arc.getSource().getId() != null ? arc.getSource().getId() : ""));
353 arcElement.setAttribute("target", (arc.getTarget().getId() != null ? arc.getTarget().getId() : ""));
354
355 writeTACPN.appendColoredArcsDependencies(arc, guiModel, document, arcElement);
356
357 if (arc instanceof TimedOutputArcComponent && arc.getWeight().value() > 1 ) {
358 Element inscription = document.createElement("inscription");
359 arcElement.appendChild(inscription);
360 Element text = document.createElement("text");
361 inscription.appendChild(text);
362 text.setTextContent(arc.getWeight().nameForSaving(false)+"");
363 }
364
365 if(arc instanceof TimedInhibitorArcComponent){
366 arcElement.setAttribute("type", "inhibitor");
367 } else {
368 arcElement.setAttribute("type", "normal");
369 }
370
371 //ArcPath
372 int arcPoints = arc.getArcPath().getArcPathDetails().length;
373 if (arcPoints > 2) {
374 Element graphics = document.createElement("graphics");
375 arcElement.appendChild(graphics);
376
377 String[][] point = arc.getArcPath().getArcPathDetails();
378 for (int j = 1; j < arcPoints-1; j++) { // Do not write the first and last point
379 graphics.appendChild(createArcPoint(point[j][0],
380 point[j][1], point[j][2], document, j));
381 }
382 }
383 return arcElement;
384 }
261 385
262 private Element createArcPoint(String x, String y, String type, Document document, int id) {386 private Element createArcPoint(String x, String y, String type, Document document, int id) {
263 Require.that(document != null, "Error: document was null");387 Require.that(document != null, "Error: document was null");
264388
=== modified file 'src/main/java/dk/aau/cs/io/PNMLoader.java'
--- src/dk/aau/cs/io/PNMLoader.java 2020-08-26 12:29:25 +0000
+++ src/main/java/dk/aau/cs/io/PNMLoader.java 2022-07-21 13:30:11 +0000
@@ -6,28 +6,25 @@
6import java.io.FileNotFoundException;6import java.io.FileNotFoundException;
7import java.io.IOException;7import java.io.IOException;
8import java.io.InputStream;8import java.io.InputStream;
9import java.util.ArrayList;9import java.util.*;
10import java.util.Arrays;
11import java.util.HashMap;
12import java.util.HashSet;
1310
14import javax.xml.parsers.DocumentBuilder;11import javax.xml.parsers.DocumentBuilder;
15import javax.xml.parsers.DocumentBuilderFactory;12import javax.xml.parsers.DocumentBuilderFactory;
16import javax.xml.parsers.ParserConfigurationException;13import javax.xml.parsers.ParserConfigurationException;
1714
18import dk.aau.cs.gui.TabContent;15import net.tapaal.gui.petrinet.TAPNLens;
16import dk.aau.cs.model.CPN.*;
17import dk.aau.cs.model.CPN.Expressions.*;
19import org.w3c.dom.Document;18import org.w3c.dom.Document;
20import org.w3c.dom.Element;19import org.w3c.dom.Element;
21import org.w3c.dom.Node;20import org.w3c.dom.Node;
22import org.w3c.dom.NodeList;21import org.w3c.dom.NodeList;
23import org.xml.sax.SAXException;22import org.xml.sax.SAXException;
2423
25import dk.aau.cs.gui.NameGenerator;24import net.tapaal.gui.petrinet.NameGenerator;
26import dk.aau.cs.model.tapn.Bound;
27import dk.aau.cs.model.tapn.IntWeight;25import dk.aau.cs.model.tapn.IntWeight;
28import dk.aau.cs.model.tapn.LocalTimedPlace;26import dk.aau.cs.model.tapn.LocalTimedPlace;
29import dk.aau.cs.model.tapn.TimeInterval;27import dk.aau.cs.model.tapn.TimeInterval;
30import dk.aau.cs.model.tapn.TimeInvariant;
31import dk.aau.cs.model.tapn.TimedArcPetriNet;28import dk.aau.cs.model.tapn.TimedArcPetriNet;
32import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;29import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;
33import dk.aau.cs.model.tapn.TimedInhibitorArc;30import dk.aau.cs.model.tapn.TimedInhibitorArc;
@@ -38,463 +35,534 @@
38import dk.aau.cs.model.tapn.TimedTransition;35import dk.aau.cs.model.tapn.TimedTransition;
39import dk.aau.cs.util.FormatException;36import dk.aau.cs.util.FormatException;
40import dk.aau.cs.util.Require;37import dk.aau.cs.util.Require;
41import pipe.dataLayer.DataLayer;38import pipe.gui.petrinet.dataLayer.DataLayer;
42import pipe.dataLayer.TAPNQuery;39import net.tapaal.gui.petrinet.verification.TAPNQuery;
43import pipe.dataLayer.Template;40import net.tapaal.gui.petrinet.Template;
44import pipe.gui.Pipe;41import pipe.gui.Constants;
45import pipe.gui.Zoomer;42import pipe.gui.canvas.Zoomer;
46import pipe.gui.graphicElements.Arc;43import pipe.gui.petrinet.graphicElements.Arc;
47import pipe.gui.graphicElements.PlaceTransitionObject;44import pipe.gui.petrinet.graphicElements.PlaceTransitionObject;
48import pipe.gui.graphicElements.tapn.TimedInhibitorArcComponent;45import pipe.gui.petrinet.graphicElements.tapn.TimedInhibitorArcComponent;
49import pipe.gui.graphicElements.tapn.TimedInputArcComponent;46import pipe.gui.petrinet.graphicElements.tapn.TimedInputArcComponent;
50import pipe.gui.graphicElements.tapn.TimedOutputArcComponent;47import pipe.gui.petrinet.graphicElements.tapn.TimedOutputArcComponent;
51import pipe.gui.graphicElements.tapn.TimedPlaceComponent;48import pipe.gui.petrinet.graphicElements.tapn.TimedPlaceComponent;
52import pipe.gui.graphicElements.tapn.TimedTransitionComponent;49import pipe.gui.petrinet.graphicElements.tapn.TimedTransitionComponent;
5350
54public class PNMLoader {51public class PNMLoader {
5552 private TAPNLens lens;
56 private final TabContent.TAPNLens lens = TabContent.TAPNLens.Default;
5753
58 enum GraphicsType { Position, Offset }54 enum GraphicsType { Position, Offset }
5955
60 private final NameGenerator nameGenerator = new NameGenerator();56 private final NameGenerator nameGenerator = new NameGenerator();
61 private final IdResolver idResolver = new IdResolver();57 private final IdResolver idResolver = new IdResolver();
62 private final HashSet<String> arcs = new HashSet<String>();58 private final HashSet<String> arcs = new HashSet<String>();
63 private final HashMap<String, TimedPlace> places = new HashMap<String, TimedPlace>();59 private final HashMap<String, TimedPlace> places = new HashMap<String, TimedPlace>();
64 private final HashMap<String, TimedTransition> transitions = new HashMap<String, TimedTransition>();60 private final HashMap<String, TimedTransition> transitions = new HashMap<String, TimedTransition>();
65 61 private final HashMap<String, ColorType> colortypes = new HashMap<String, ColorType>();
66 //If the net is too big, do not make the graphics62 private final HashMap<String, Variable> variables = new HashMap<String, Variable>();
67 private int netSize = 0;63
68 private final int maxNetSize = 4000;64 //If the net is too big, do not make the graphics
69 private boolean hasPositionalInfo = false;65 private int netSize = 0;
70 66 private final int maxNetSize = 4000;
71 public PNMLoader() {67 private boolean hasPositionalInfo = false;
72 }68 private final LoadTACPN loadTACPN;
73 69
74 public LoadedModel load(File file) throws FormatException{70 public PNMLoader() {
75 try{71 this.lens = TAPNLens.Default;
76 return load(new FileInputStream(file));72 loadTACPN = new LoadTACPN();
77 } catch (FileNotFoundException e){73 }
78 return null;74
79 } catch (NullPointerException e){75 public LoadedModel load(File file) throws FormatException{
80 throw new FormatException("the PNML file cannot be parsed due to syntax errors");76 try{
81 }77 return load(new FileInputStream(file));
82 }78 } catch (FileNotFoundException e){
83 79 return null;
84 public LoadedModel load(InputStream file) throws FormatException{80 } catch (NullPointerException e){
85 Document doc = loadDocument(file);81 throw new FormatException("the PNML file cannot be parsed due to syntax errors", e);
86 82 }
87 return parse(doc);83 }
88 }84
8985 public LoadedModel load(InputStream file) throws FormatException{
90 private Document loadDocument(InputStream file) {86 Document doc = loadDocument(file);
91 try {87
92 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();88 return parse(doc);
93 return builder.parse(file);89 }
94 } catch (ParserConfigurationException | IOException | SAXException e) {90
95 return null;91 private Document loadDocument(InputStream file) {
96 }92 try {
97 }93 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
98 94 return builder.parse(file);
99 private LoadedModel parse(Document doc) throws FormatException {95 } catch (ParserConfigurationException | IOException | SAXException e) {
100 idResolver.clear();96 return null;
101 97 }
102 TimedArcPetriNetNetwork network = new TimedArcPetriNetNetwork();98 }
103 99
104 //We assume there is only one net per file (this is what we call a TAPN Network) 100 private LoadedModel parse(Document doc) throws FormatException {
105 Node pnmlElement = doc.getElementsByTagName("pnml").item(0);101 idResolver.clear();
106 Node netNode = getFirstDirectChild(pnmlElement, "net");102
107 103 TimedArcPetriNetNetwork network = new TimedArcPetriNetNetwork();
108 String name = getTAPNName(netNode);104
109 105 //We assume there is only one net per file (this is what we call a TAPN Network)
110 TimedArcPetriNet tapn = new TimedArcPetriNet(name);106 Node pnmlElement = doc.getElementsByTagName("pnml").item(0);
111 tapn.setCheckNames(false);107 Node netNode = getFirstDirectChild(pnmlElement, "net");
112 network.add(tapn);108
113 nameGenerator.add(tapn);109 lens = new TAPNLens(false, false, getFirstDirectChild(netNode, "declaration") != null);
114110
115 //We assume there is only one page pr. file (this is what we call a net) 111 String name = getTAPNName(netNode);
116 Template template = new Template(tapn, new DataLayer(), new Zoomer());112
117 113 TimedArcPetriNet tapn = new TimedArcPetriNet(name);
118 parseTimedArcPetriNet(netNode, tapn, template);114 tapn.setCheckNames(false);
119 template.setHasPositionalInfo(hasPositionalInfo);115 network.add(tapn);
120 116 nameGenerator.add(tapn);
121 network.setPaintNet(isNetDrawable());117
122 tapn.setCheckNames(true);118 //We assume there is only one page pr. file (this is what we call a net)
123 return new LoadedModel(network, Arrays.asList(template), new ArrayList<TAPNQuery>(), new ArrayList<>(), null);119 Template template = new Template(tapn, new DataLayer(), new Zoomer());
124 }120
125121 parseTimedArcPetriNet(netNode, tapn, template, network);
126 private String getTAPNName(Node netNode) {122 template.setHasPositionalInfo(hasPositionalInfo);
127 if(!(netNode instanceof Element)){123
128 return nameGenerator.getNewTemplateName();124 network.setPaintNet(isNetDrawable());
129 }125 tapn.setCheckNames(true);
130 String result = null;126
131127 return new LoadedModel(network, List.of(template), new ArrayList<TAPNQuery>(), new ArrayList<>(), lens);
132 Node name = getFirstDirectChild(netNode, "name");128 }
133 if(name != null){129
134 result = getFirstDirectChild(name, "text").getTextContent();130 private String getTAPNName(Node netNode) {
135 }131 if(!(netNode instanceof Element)){
136 132 return nameGenerator.getNewTemplateName();
137 if(name == null || name.equals("")){133 }
138 return nameGenerator.getNewTemplateName();134 String result = null;
139 }135
140 136 Node name = getFirstDirectChild(netNode, "name");
141 return NamePurifier.purify(result);137 if(name != null){
142 }138 result = getFirstDirectChild(name, "text").getTextContent();
143139 }
144 private void parseTimedArcPetriNet(Node netNode, TimedArcPetriNet tapn, Template template) throws FormatException {140
145 //We assume there is only one page pr. file (this is what we call a net) 141 if(name == null || name.equals("")){
146 Node node = getFirstDirectChild(netNode, "page").getFirstChild();142 return nameGenerator.getNewTemplateName();
147 Node first = node;143 }
148 144
149 //Calculate netsize145 return NamePurifier.purify(result);
150 while(node != null){146 }
151 netSize += 1;147
152 node = node.getNextSibling();148 private void parseTimedArcPetriNet(Node netNode, TimedArcPetriNet tapn, Template template, TimedArcPetriNetNetwork network) throws FormatException {
153 }149 if (lens.isColored()) {
154 150 Node declarations = getFirstDirectChild(netNode, "declaration");
155 node = first;151 loadTACPN.parseDeclarations(declarations, network);
156 //We parse the places and transitions first152 }
157 while(node != null){153
158 String tag = node.getNodeName();154 //We assume there is only one page pr. file (this is what we call a net)
159 if(tag.equals("place")){155 Node node = getFirstDirectChild(netNode, "page").getFirstChild();
160 parsePlace(node, tapn, template);156 Node first = node;
161 } else if(tag.equals("transition")){157
162 parseTransition(node, tapn, template);158 //Calculate netsize
163 }159 while(node != null){
164 node = node.getNextSibling();160 netSize += 1;
165 }161 node = node.getNextSibling();
166 162 }
167 //We parse the transitions last, as we need the places and transitions it refers to163
168 node = first;164 node = first;
169 while(node != null){165 //We parse the places and transitions first
170 String tag = node.getNodeName();166 while(node != null){
171 if(tag.equals("arc")){167 String tag = node.getNodeName();
172 parseArc(node, template);168 if(tag.equals("place")){
173 } 169 parsePlace(node, tapn, template);
174 node = node.getNextSibling();170 } else if(tag.equals("transition")){
175 }171 parseTransition(node, tapn, template);
176 }172 }
177173 node = node.getNextSibling();
178 private void parsePlace(Node node, TimedArcPetriNet tapn, Template template) {174 }
179 if(!(node instanceof Element)){175 //We parse the transitions last, as we need the places and transitions it refers to
180 return;176 node = first;
181 }177 while(node != null){
182 178 String tag = node.getNodeName();
183 Name name = parseName(getFirstDirectChild(node, "name"));179 if(tag.equals("arc")){
184 if(name == null){180 parseArc(node, template);
185 name = new Name(nameGenerator.getNewPlaceName(template.model()));181 }
186 }182 node = node.getNextSibling();
187 Point position = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Position);183 }
188 String id = NamePurifier.purify(((Element) node).getAttribute("id"));184 }
189 InitialMarking marking = parseMarking(getFirstDirectChild(node, "initialMarking")); 185 private void parsePlace(Node node, TimedArcPetriNet tapn, Template template) throws FormatException {
190 186 if (!(node instanceof Element)) {
191 TimedPlace place = new LocalTimedPlace(id, new TimeInvariant(false, new Bound.InfBound()));187 return;
192 Require.that(places.put(id, place) == null && !transitions.containsKey(id), 188 }
193 "The name: " + id + ", was already used");189
194 tapn.add(place);190 Name name = parseName(getFirstDirectChild(node, "name"));
195 191 if (name == null) {
196 if(isNetDrawable()){192 name = new Name(nameGenerator.getNewPlaceName(template.model()));
197 //We parse the id as both the name and id as in tapaal name = id, and name/id has to be unique 193 }
198 TimedPlaceComponent placeComponent = new TimedPlaceComponent(position.x, position.y, id, name.point.x, name.point.y, lens);194 Point position = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Position);
199 placeComponent.setUnderlyingPlace(place);195 String id = NamePurifier.purify(((Element) node).getAttribute("id"));
200 template.guiModel().addPetriNetObject(placeComponent);196 ArcExpression colorMarking = null;
201 }197 Point markingOffset = null;
202 198 TimedPlace place;
203 idResolver.add(tapn.name(), id, id);199 InitialMarking marking = parseMarking(getFirstDirectChild(node, "initialMarking"));
204 200 ColorType colorType = ColorType.COLORTYPE_DOT;
205 for (int i = 0; i < marking.marking; i++) {201 Node typeNode = getFirstDirectChild(node, "type");
206 tapn.parentNetwork().marking().add(new TimedToken(place));202 if (typeNode != null) {
207 }203 try {
208 }204 colorType = loadTACPN.parseUserSort(typeNode);
209 205 } catch (FormatException e) {
210 private InitialMarking parseMarking(Node node) {206 e.printStackTrace();
211 if(!(node instanceof Element)){207 }
212 return new InitialMarking();208 }
213 }209 Node markingNode = getFirstDirectChild(node, "hlinitialMarking");
214 210 if (markingNode instanceof Element) {
215 Point offset = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Offset);211 try {
216 212 colorMarking = loadTACPN.parseArcExpression(((Element) markingNode).getElementsByTagName("structure").item(0));
217 int marking = Integer.parseInt(getFirstDirectChild(node, "text").getTextContent());213 } catch (FormatException e) {
218 214 e.printStackTrace();
219 return new InitialMarking(marking, offset);215 }
220 }216 }
221217 place = new LocalTimedPlace(id, colorType);
222 private void parseTransition(Node node, TimedArcPetriNet tapn, Template template) {218
223 if(!(node instanceof Element)){219 Require.that(places.put(id, place) == null && !transitions.containsKey(id),
224 return;220 "The name: " + id + ", was already used");
225 }221 tapn.add(place);
226 222
227 Point position = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Position);223 if (isNetDrawable()) {
228 Name name = parseName(getFirstDirectChild(node, "name"));224 //We parse the id as both the name and id as in tapaal name = id, and name/id has to be unique
229 if(name == null){225 TimedPlaceComponent placeComponent;
230 name = new Name(nameGenerator.getNewTransitionName(template.model()));226 placeComponent = new TimedPlaceComponent(position.x, position.y, id, name.point.x, name.point.y, lens);
231 }227 placeComponent.setUnderlyingPlace(place);
232 String id = NamePurifier.purify(((Element) node).getAttribute("id"));228 template.guiModel().addPetriNetObject(placeComponent);
233 229 }
234 TimedTransition transition = new TimedTransition(id);230
235 Require.that(transitions.put(id, transition) == null && !places.containsKey(id), 231 idResolver.add(tapn.name(), id, id);
236 "The id: " + id + ", was already used");232
237 tapn.add(transition);233
238 234 if (colorMarking != null) {
239 if(isNetDrawable()){235 ExpressionContext context = new ExpressionContext(new HashMap<String, Color>(), loadTACPN.getColortypes());
240 TimedTransitionComponent transitionComponent = 236 ColorMultiset cm = colorMarking.eval(context);
241 //We parse the id as both the name and id as in tapaal name = id, and name/id has to be unique 237 place.setTokenExpression(loadTACPN.constructCleanAddExpression(colorType,cm));
242 new TimedTransitionComponent(position.x, position.y, id, name.point.x, name.point.y, true, false, 0, 0, lens);238 for (TimedToken ct : cm.getTokens(place)) {
243 transitionComponent.setUnderlyingTransition(transition);239 tapn.parentNetwork().marking().add(ct);
244 template.guiModel().addPetriNetObject(transitionComponent);240 }
245 }241
246 idResolver.add(tapn.name(), id, id);242 } else {
247 }243 for (int i = 0; i < marking.marking; i++) {
248 244 tapn.parentNetwork().marking().add(new TimedToken(place, ColorType.COLORTYPE_DOT.getFirstColor()));
249 private void parseArc(Node node, Template template) throws FormatException {245 }
250 if(!(node instanceof Element)){246 if (marking.marking > 1) {
251 return;247 Vector<ColorExpression> v = new Vector<>();
252 }248 v.add(new DotConstantExpression());
253 249 Vector<ArcExpression> numbOfExpression = new Vector<>();
254 Element element = (Element) node;250 numbOfExpression.add(new NumberOfExpression(marking.marking, v));
255 251 place.setTokenExpression(new AddExpression(numbOfExpression));
256 String id = element.getAttribute("id");252 }
257 String sourceId = NamePurifier.purify(element.getAttribute("source"));253 }
258 String targetId = NamePurifier.purify(element.getAttribute("target"));254 }
259 String type = element.getAttribute("type");255
260 256
261 String sourceName = idResolver.get(template.model().name(), sourceId);257 private static Node skipWS(Node node) {
262 String targetName = idResolver.get(template.model().name(), targetId);258 if (node != null && !(node instanceof Element)) {
263 259 return skipWS(node.getNextSibling());
264 TimedPlace sourcePlace = places.get(sourceName);260 } else {
265 TimedPlace targetPlace = places.get(targetName);261 return node;
266 262 }
267 TimedTransition sourceTransition = transitions.get(sourceName);263 }
268 TimedTransition targetTransition = transitions.get(targetName);264
269 265 private static Node getAttribute(Node node, String attribute) {
270 PlaceTransitionObject source = template.guiModel().getPlaceTransitionObject(sourceName);266 return node.getAttributes().getNamedItem(attribute);
271 PlaceTransitionObject target = template.guiModel().getPlaceTransitionObject(targetName);267 }
272 268
273 //Inscription269
274 int weight = 1;270 private InitialMarking parseMarking(Node node) {
275 Node inscription = getFirstDirectChild(node, "inscription");271 if(!(node instanceof Element)){
276 if(inscription != null){272 return new InitialMarking();
277 Node text = getFirstDirectChild(inscription, "text");273 }
278 if(text != null){274
279 String weightString = text.getTextContent().trim();275 Point offset = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Offset);
276
277 int marking = Integer.parseInt(getFirstDirectChild(node, "text").getTextContent());
278
279 return new InitialMarking(marking, offset);
280 }
281
282 private void parseTransition(Node node, TimedArcPetriNet tapn, Template template) throws FormatException {
283 if(!(node instanceof Element)){
284 return;
285 }
286
287 Point position = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Position);
288 Name name = parseName(getFirstDirectChild(node, "name"));
289 if(name == null){
290 name = new Name(nameGenerator.getNewTransitionName(template.model()));
291 }
292 String id = NamePurifier.purify(((Element) node).getAttribute("id"));
293
294 GuardExpression guardExpression = null;
295 Node conditionNode = getFirstDirectChild(node, "condition");
296 if (conditionNode != null) {
297 guardExpression = loadTACPN.parseGuardExpression(getFirstDirectChild(conditionNode, "structure"));
298 }
299
300 TimedTransition transition = new TimedTransition(id, guardExpression);
301 Require.that(transitions.put(id, transition) == null && !places.containsKey(id),
302 "The id: " + id + ", was already used");
303 tapn.add(transition);
304
305 if(isNetDrawable()){
306 TimedTransitionComponent transitionComponent =
307 //We parse the id as both the name and id as in tapaal name = id, and name/id has to be unique
308 new TimedTransitionComponent(position.x, position.y, id, name.point.x, name.point.y, 0, lens);
309 transitionComponent.setUnderlyingTransition(transition);
310 template.guiModel().addPetriNetObject(transitionComponent);
311 }
312 idResolver.add(tapn.name(), id, id);
313 }
314
315 private void parseArc(Node node, Template template) throws FormatException {
316 if(!(node instanceof Element)){
317 return;
318 }
319
320 Element element = (Element) node;
321
322 String id = element.getAttribute("id");
323 String sourceId = NamePurifier.purify(element.getAttribute("source"));
324 String targetId = NamePurifier.purify(element.getAttribute("target"));
325 String type = element.getAttribute("type");
326
327 String sourceName = idResolver.get(template.model().name(), sourceId);
328 String targetName = idResolver.get(template.model().name(), targetId);
329
330 TimedPlace sourcePlace = places.get(sourceName);
331 TimedPlace targetPlace = places.get(targetName);
332
333 TimedTransition sourceTransition = transitions.get(sourceName);
334 TimedTransition targetTransition = transitions.get(targetName);
335
336 PlaceTransitionObject source = template.guiModel().getPlaceTransitionObject(sourceName);
337 PlaceTransitionObject target = template.guiModel().getPlaceTransitionObject(targetName);
338
339 //Inscription
340 int weight = 1;
341 Node inscription = getFirstDirectChild(node, "inscription");
342 if(inscription != null){
343 Node text = getFirstDirectChild(inscription, "text");
344 if(text != null){
345 String weightString = text.getTextContent().trim();
280 try {346 try {
281 weight = Integer.parseInt(weightString);347 weight = Integer.parseInt(weightString);
282 } catch (NumberFormatException ignored) {} //Default values is 1348 } catch (NumberFormatException ignored) {} //Default values is 1
283 }349 }
284 }350 }
285 351
286 int _startx = 0, _starty = 0, _endx = 0, _endy = 0;352 int _startx = 0, _starty = 0, _endx = 0, _endy = 0;
287 353
288 if(isNetDrawable()){354 if(isNetDrawable()){
289 // add the insets and offset355 // add the insets and offset
290 _startx = source.getX() + source.centreOffsetLeft();356 _startx = source.getX() + source.centreOffsetLeft();
291 _starty = source.getY() + source.centreOffsetTop();357 _starty = source.getY() + source.centreOffsetTop();
292358
293 _endx = target.getX() + target.centreOffsetLeft();359 _endx = target.getX() + target.centreOffsetLeft();
294 _endy = target.getY() + target.centreOffsetTop();360 _endy = target.getY() + target.centreOffsetTop();
295 }361 }
296 362
297 Arc tempArc;363 Arc tempArc;
298 364 ArcExpression arcExpression = null;
299 if(type != null && type.equals("inhibitor")) {365 Node hlInscriptionNode = getFirstDirectChild(node, "hlinscription");
300 tempArc = parseAndAddTimedInhibitorArc(id, sourcePlace, targetTransition, source, target, weight, _endx, _endy, template);366 if (hlInscriptionNode != null) {
301 } else if(sourcePlace != null && targetTransition != null) {367 arcExpression = loadTACPN.parseArcExpression(getFirstDirectChild(hlInscriptionNode, "structure"));
302 tempArc = parseInputArc(id, sourcePlace, targetTransition, source, target, weight, _endx, _endy, template);368 }
303 } else if(sourceTransition != null && targetPlace != null) {369
304 tempArc = parseOutputArc(id, sourceTransition, targetPlace, source, target, weight, _endx, _endy, template);370 if(type != null && type.equals("inhibitor")) {
305 } else {371 tempArc = parseAndAddTimedInhibitorArc(id, sourcePlace, targetTransition, source, target, weight, arcExpression, _endx, _endy, template);
306 throw new FormatException("Arcs must be only between places and transitions");372 } else if(sourcePlace != null && targetTransition != null) {
307 }373 tempArc = parseInputArc(id, sourcePlace, targetTransition, source, target, weight, arcExpression, _endx, _endy, template);
308 374 } else if(sourceTransition != null && targetPlace != null) {
309 if(isNetDrawable()) parseArcPath(element, tempArc);375 tempArc = parseOutputArc(id, sourceTransition, targetPlace, source, target, weight, arcExpression, _endx, _endy, template);
310 }376 } else {
311 377 throw new FormatException("Arcs must be only between places and transitions");
312 private void parseArcPath(Element arc, Arc tempArc) {378 }
313 Element element = (Element) getFirstDirectChild(arc, "graphics");379
314 if(element == null) return;380 if(isNetDrawable()) parseArcPath(element, tempArc);
315 NodeList nodelist = element.getElementsByTagName("position");381 }
316 if (nodelist.getLength() > 0) {382
317 for (int i = 0; i < nodelist.getLength(); i++) {383 private void parseArcPath(Element arc, Arc tempArc) {
318 Node node = nodelist.item(i);384 Element element = (Element) getFirstDirectChild(arc, "graphics");
319 if (node instanceof Element) {385 if(element == null) return;
320 Element position = (Element) node;386 NodeList nodelist = element.getElementsByTagName("position");
321 if ("position".equals(position.getNodeName())) {387 if (nodelist.getLength() > 0) {
322 String arcTempX = position.getAttribute("x");388 for (int i = 0; i < nodelist.getLength(); i++) {
323 String arcTempY = position.getAttribute("y");389 Node node = nodelist.item(i);
324390 if (node instanceof Element) {
325 double arcPointX = Double.parseDouble(arcTempX);391 Element position = (Element) node;
392 if ("position".equals(position.getNodeName())) {
393 String arcTempX = position.getAttribute("x");
394 String arcTempY = position.getAttribute("y");
395
396 double arcPointX = Double.parseDouble(arcTempX);
326 double arcPointY = Double.parseDouble(arcTempY);397 double arcPointY = Double.parseDouble(arcTempY);
327 arcPointX += Pipe.ARC_CONTROL_POINT_CONSTANT + 1;398 arcPointX += Constants.ARC_CONTROL_POINT_CONSTANT + 1;
328 arcPointY += Pipe.ARC_CONTROL_POINT_CONSTANT + 1;399 arcPointY += Constants.ARC_CONTROL_POINT_CONSTANT + 1;
329 400
330 //We add the point at i+1 as the starting and end points of 401 //We add the point at i+1 as the starting and end points of
331 //the arc is already in the path as point number 0 and 1402 //the arc is already in the path as point number 0 and 1
332 tempArc.getArcPath().addPoint(i+1,arcPointX, arcPointY, false);403 tempArc.getArcPath().addPoint(i+1,arcPointX, arcPointY, false);
333 }404 }
334 }405 }
335 }406 }
336 }407 }
337 }408 }
338409
339 private Name parseName(Node node){410 private Name parseName(Node node){
340 if(!(node instanceof Element)){411 if(!(node instanceof Element)){
341 return null;412 return null;
342 }413 }
343 Point offset = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Offset);414 Point offset = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Offset);
344 415
345 String name = getFirstDirectChild(node, "text").getTextContent();416 String name = getFirstDirectChild(node, "text").getTextContent();
346 if(name == null || name.equals("")){417 if(name == null || name.equals("")){
347 return null;418 return null;
348 }419 }
349 420
350 name = NamePurifier.purify(name);421 name = NamePurifier.purify(name);
351 return new Name(name, offset);422 return new Name(name, offset);
352 }423 }
353 424
354 private Point parseGraphics(Node node, GraphicsType type){425 private Point parseGraphics(Node node, GraphicsType type){
355 if(!(node instanceof Element)){426 if(!(node instanceof Element)){
356 if(type == GraphicsType.Offset)427 if(type == GraphicsType.Offset)
357 return new Point(0, -10);428 return new Point(0, -10);
358 else 429 else
359 return new Point(100, 100);430 return new Point(100, 100);
360 }431 }
361 432
362 hasPositionalInfo = true;433 hasPositionalInfo = true;
363 Element offset = (Element)getFirstDirectChild(node, type == GraphicsType.Offset ? "offset" : "position");434 Element offset = (Element)getFirstDirectChild(node, type == GraphicsType.Offset ? "offset" : "position");
364 435
365 String x = offset.getAttribute("x");436 String x = offset.getAttribute("x");
366 String y = offset.getAttribute("y");437 String y = offset.getAttribute("y");
367 438
368 int xd = Math.round(Float.parseFloat(x));439 int xd = Math.round(Float.parseFloat(x));
369 int yd = Math.round(Float.parseFloat(y));440 int yd = Math.round(Float.parseFloat(y));
370 441
371 return new Point(xd, yd);442 return new Point(xd, yd);
372 }443 }
373444
374 private static class Name{445 private static class Name{
375 String name;446 final String name;
376 Point point;447 final Point point;
377 448
378 public Name(String newPlaceName) {449 public Name(String newPlaceName) {
379 this(newPlaceName, new Point());450 this(newPlaceName, new Point());
380 }451 }
381 452
382 public Name(String name, Point p) {453 public Name(String name, Point p) {
383 this.name = name;454 this.name = name;
384 this.point = p;455 this.point = p;
385 }456 }
386457
387 @Override458 @Override
388 public String toString() {459 public String toString() {
389 return name + ";" + point;460 return name + ";" + point;
390 }461 }
391 }462 }
392 463
393 private static class InitialMarking{464 private static class InitialMarking{
394 int marking;465 final int marking;
395 Point point;466 final Point point;
396 467
397 public InitialMarking() {468 public InitialMarking() {
398 this(0, new Point());469 this(0, new Point());
399 }470 }
400 471
401 472
402 public InitialMarking(int marking, Point p) {473 public InitialMarking(int marking, Point p) {
403 this.marking = marking;474 this.marking = marking;
404 this.point = p;475 this.point = p;
405 }476 }
406 477
407 @Override478 @Override
408 public String toString() {479 public String toString() {
409 return marking + ";" + point;480 return marking + ";" + point;
410 }481 }
411 }482 }
412 483
413 private TimedInputArcComponent parseInputArc(String arcId, TimedPlace place, TimedTransition transition, PlaceTransitionObject source,484 private TimedInputArcComponent parseInputArc(String arcId, TimedPlace place, TimedTransition transition, PlaceTransitionObject source,
414 PlaceTransitionObject target, int weight, int _endx,485 PlaceTransitionObject target, int weight, ArcExpression arcExpression, int _endx,
415 int _endy, Template template) throws FormatException {486 int _endy, Template template) throws FormatException {
416487 TimedInputArc inputArc = new TimedInputArc(place, transition, TimeInterval.ZERO_INF, new IntWeight(weight), arcExpression);
417 TimedInputArc inputArc = new TimedInputArc(place, transition, TimeInterval.ZERO_INF, new IntWeight(weight));488
418 489 Require.that(places.containsKey(inputArc.source().name()), "The source place must be part of the petri net.");
419 Require.that(places.containsKey(inputArc.source().name()), "The source place must be part of the petri net.");490 Require.that(transitions.containsKey(inputArc.destination().name()), "The destination transition must be part of the petri net");
420 Require.that(transitions.containsKey(inputArc.destination().name()), "The destination transition must be part of the petri net");491 if(!arcs.add(inputArc.source().name() + "-in-" + inputArc.destination().name())) {
421 if(!arcs.add(inputArc.source().name() + "-in-" + inputArc.destination().name())) {492 throw new FormatException("Multiple arcs between a place and a transition is not allowed");
422 throw new FormatException("Multiple arcs between a place and a transition is not allowed");493 }
423 }494
424 495 TimedInputArcComponent arc = null;
425 TimedInputArcComponent arc = null;496
426 497 if(isNetDrawable()){
427 if(isNetDrawable()){498 arc = new TimedInputArcComponent(new TimedOutputArcComponent(source, target, weight, arcId), lens);
428 arc = new TimedInputArcComponent(new TimedOutputArcComponent(source, target, weight, arcId), lens);499 arc.setUnderlyingArc(inputArc);
429 arc.setUnderlyingArc(inputArc);500
430501 template.guiModel().addPetriNetObject(arc);
431 template.guiModel().addPetriNetObject(arc);502 }
432 }503
433 504 template.model().add(inputArc);
434 template.model().add(inputArc);505
435 506 return arc;
436 return arc;507
437508
438 509 }
439 }510
440 511 private Arc parseOutputArc(String arcId, TimedTransition transition, TimedPlace place, PlaceTransitionObject source,
441 private Arc parseOutputArc(String arcId, TimedTransition transition, TimedPlace place, PlaceTransitionObject source,512 PlaceTransitionObject target, int weight, ArcExpression arcExpression, int _endx,
442 PlaceTransitionObject target, int weight, int _endx,
443 int _endy, Template template) throws FormatException {513 int _endy, Template template) throws FormatException {
444 514 TimedOutputArc outputArc = new TimedOutputArc(transition, place, new IntWeight(weight),arcExpression);
445 TimedOutputArc outputArc = new TimedOutputArc(transition, place, new IntWeight(weight));515
446 516 Require.that(places.containsKey(outputArc.destination().name()), "The destination place must be part of the petri net.");
447 Require.that(places.containsKey(outputArc.destination().name()), "The destination place must be part of the petri net.");517 Require.that(transitions.containsKey(outputArc.source().name()), "The source transition must be part of the petri net");
448 Require.that(transitions.containsKey(outputArc.source().name()), "The source transition must be part of the petri net");518 if(!arcs.add(outputArc.source().name() + "-out-" + outputArc.destination().name())) {
449 if(!arcs.add(outputArc.source().name() + "-out-" + outputArc.destination().name())) {519 throw new FormatException("Multiple arcs between a place and a transition is not allowed");
450 throw new FormatException("Multiple arcs between a place and a transition is not allowed");520 }
451 }521
452 522 TimedOutputArcComponent arc = null;
453 TimedOutputArcComponent arc = null;523
454 524 if(isNetDrawable()){
455 if(isNetDrawable()){525 arc = new TimedOutputArcComponent(
456 arc = new TimedOutputArcComponent(
457 source, target, weight, arcId);526 source, target, weight, arcId);
458 arc.setUnderlyingArc(outputArc);527 arc.setUnderlyingArc(outputArc);
459528
460 template.guiModel().addPetriNetObject(arc);529 template.guiModel().addPetriNetObject(arc);
461530
462 }531 }
463 532
464 template.model().add(outputArc);533 template.model().add(outputArc);
465 return arc;534 return arc;
466 }535 }
467 536
468 private Arc parseAndAddTimedInhibitorArc(String arcId, TimedPlace place, TimedTransition transition, PlaceTransitionObject source,537 private Arc parseAndAddTimedInhibitorArc(String arcId, TimedPlace place, TimedTransition transition, PlaceTransitionObject source,
469 PlaceTransitionObject target, int weight, int _endx,538 PlaceTransitionObject target, int weight, ArcExpression arcExpression, int _endx,
470 int _endy, Template template) {539 int _endy, Template template) {
471 TimedInhibitorArcComponent tempArc = new TimedInhibitorArcComponent(540 TimedInhibitorArcComponent tempArc = new TimedInhibitorArcComponent(
472 new TimedInputArcComponent(541 new TimedInputArcComponent(
473 new TimedOutputArcComponent(source, target, weight, arcId)542 new TimedOutputArcComponent(source, target, weight, arcId)
474 ),543 ));
475 (""));544
476 545 TimedInhibitorArc inhibArc = new TimedInhibitorArc(place, transition, TimeInterval.ZERO_INF, new IntWeight(weight), arcExpression);
477 TimedInhibitorArc inhibArc = new TimedInhibitorArc(place, transition, TimeInterval.ZERO_INF, new IntWeight(weight));546
478547 tempArc.setUnderlyingArc(inhibArc);
479 tempArc.setUnderlyingArc(inhibArc);548 template.guiModel().addPetriNetObject(tempArc);
480 template.guiModel().addPetriNetObject(tempArc);549 template.model().add(inhibArc);
481 template.model().add(inhibArc);550
482551 return tempArc;
483 return tempArc;552 }
484 }553
485 554 private boolean isNetDrawable(){
486 private boolean isNetDrawable(){555 return netSize <= maxNetSize;
487 return netSize <= maxNetSize;556 }
488 }557
489 558 Node getFirstDirectChild(Node parent, String tagName){
490 Node getFirstDirectChild(Node parent, String tagName){559 NodeList children = parent.getChildNodes();
491 NodeList children = parent.getChildNodes();560 for(int i = 0; i < children.getLength(); i++){
492 for(int i = 0; i < children.getLength(); i++){561 if(children.item(i).getNodeName().equals(tagName)){
493 if(children.item(i).getNodeName().equals(tagName)){562 return children.item(i);
494 return children.item(i);563 }
495 }564 }
496 }565 return null;
497 return null;566 }
498 }
499567
500}568}
501569
=== added file 'src/main/java/dk/aau/cs/io/TapnEngineXmlLoader.java'
--- src/main/java/dk/aau/cs/io/TapnEngineXmlLoader.java 1970-01-01 00:00:00 +0000
+++ src/main/java/dk/aau/cs/io/TapnEngineXmlLoader.java 2022-07-21 13:30:11 +0000
@@ -0,0 +1,993 @@
1package dk.aau.cs.io;
2
3import net.tapaal.gui.petrinet.NameGenerator;
4import net.tapaal.gui.petrinet.TAPNLens;
5import dk.aau.cs.io.queries.TAPNQueryLoader;
6import dk.aau.cs.model.CPN.*;
7import dk.aau.cs.model.CPN.Expressions.*;
8import dk.aau.cs.model.tapn.*;
9import dk.aau.cs.util.FormatException;
10import dk.aau.cs.util.Require;
11import kotlin.Pair;
12import org.w3c.dom.Document;
13import org.w3c.dom.Element;
14import org.w3c.dom.Node;
15import org.w3c.dom.NodeList;
16import org.xml.sax.SAXException;
17import pipe.gui.petrinet.dataLayer.DataLayer;
18import net.tapaal.gui.petrinet.Template;
19import pipe.gui.Constants;
20import pipe.gui.canvas.Zoomer;
21import pipe.gui.petrinet.graphicElements.AnnotationNote;
22import pipe.gui.petrinet.graphicElements.Arc;
23import pipe.gui.petrinet.graphicElements.Place;
24import pipe.gui.petrinet.graphicElements.PlaceTransitionObject;
25import pipe.gui.petrinet.graphicElements.tapn.*;
26
27import javax.xml.parsers.DocumentBuilder;
28import javax.xml.parsers.DocumentBuilderFactory;
29import javax.xml.parsers.ParserConfigurationException;
30import java.io.File;
31import java.io.IOException;
32import java.util.*;
33
34/*
35 This is a huge quick hack to allow reading an unfolded net from then engine.
36 The engine format uses <graphics> tags to store elements unlike the tapn format.
37
38 It feel like this should not work, but it seems to do, and we needed a quick hack to get it working.
39
40 */
41
42public class TapnEngineXmlLoader {
43 private static final String PLACENAME_ERROR_MESSAGE = "The keywords \"true\" and \"false\" are reserved and can not be used as place names.\nPlaces with these names will be renamed to \"_true\" and \"_false\" respectively.\n\n Note that any queries using these places may not be parsed correctly.";
44
45 private final HashMap<TimedTransitionComponent, TimedTransportArcComponent> presetArcs = new HashMap<TimedTransitionComponent, TimedTransportArcComponent>();
46 private final HashMap<TimedTransitionComponent, TimedTransportArcComponent> postsetArcs = new HashMap<TimedTransitionComponent, TimedTransportArcComponent>();
47 private final HashMap<TimedTransportArcComponent, TimeInterval> transportArcsTimeIntervals = new HashMap<TimedTransportArcComponent, TimeInterval>();
48 private final HashMap<TimedTransportArcComponent, List<ColoredTimeInterval>> coloredTransportArcsTimeIntervals = new HashMap<TimedTransportArcComponent, List<ColoredTimeInterval>>();
49 private ArcExpression transportExpr;
50
51 private final NameGenerator nameGenerator = new NameGenerator();
52 private boolean firstInhibitorIntervalWarning = true;
53 private boolean firstPlaceRenameWarning = true;
54 private final IdResolver idResolver = new IdResolver();
55 private final Collection<String> messages = new ArrayList<>(10);
56 private final LoadTACPN loadTACPN = new LoadTACPN();
57
58 boolean hasFeatureTag = false;
59 private TAPNLens lens = TAPNLens.Default;
60
61 public TapnEngineXmlLoader() {}
62
63 public LoadedModel load(File file) throws Exception {
64 Require.that(file != null && file.exists(), "file must be non-null and exist");
65
66 Document doc = loadDocument(file);
67 if(doc == null) return null;
68 try {
69 return parse(doc);
70 } catch (FormatException | NullPointerException e) {
71 throw e;
72 } catch (Exception e) {
73 throw new Exception("One or more necessary attributes were not found\n - One or more attribute values have an incorrect type", e);
74 }
75 }
76
77 private Document loadDocument(File file) {
78 try {
79 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
80 return builder.parse(file);
81 } catch (ParserConfigurationException | IOException | SAXException e) {
82 return null;
83 }
84 }
85
86 private LoadedModel parse(Document doc) throws FormatException {
87 idResolver.clear();
88
89 ConstantStore constants = new ConstantStore(parseConstants(doc));
90 TimedArcPetriNetNetwork network = new TimedArcPetriNetNetwork(constants, new ArrayList<>());
91 NodeList declarations = doc.getElementsByTagName("declaration");
92
93 if (declarations.getLength() > 0) {
94 for (int i = 0; i < declarations.getLength(); i++) {
95 Node node = declarations.item(i);
96 if (node.getNodeName().equals("declaration")) {
97 loadTACPN.parseDeclarations(node, network);
98 }
99 }
100 for(String message : loadTACPN.getMessages()){
101 messages.add(message);
102 }
103 } else{
104 network.add(ColorType.COLORTYPE_DOT);
105 }
106 parseSharedPlaces(doc, network, constants);
107 parseSharedTransitions(doc, network);
108
109 Collection<Template> templates = parseTemplates(doc, network, constants);
110 LoadedQueries loadedQueries = new TAPNQueryLoader(doc, network).parseQueries();
111
112 if (loadedQueries != null) {
113 for (String message : loadedQueries.getMessages()) {
114 messages.add(message);
115 }
116 }
117 network.buildConstraints();
118
119 parseBound(doc, network);
120
121 parseFeature(doc, network);
122
123 if (hasFeatureTag) {
124 return new LoadedModel(network, templates, loadedQueries.getQueries(), messages, lens);
125 } else {
126 return new LoadedModel(network, templates, loadedQueries.getQueries(), messages, null);
127 }
128 }
129
130 private void parseBound(Document doc, TimedArcPetriNetNetwork network){
131 if(doc.getElementsByTagName("k-bound").getLength() > 0){
132 int i = Integer.parseInt(doc.getElementsByTagName("k-bound").item(0).getAttributes().getNamedItem("bound").getNodeValue());
133 network.setDefaultBound(i);
134 }
135 }
136
137 private void parseFeature(Document doc, TimedArcPetriNetNetwork network) {
138 if (doc.getElementsByTagName("feature").getLength() > 0) {
139 NodeList nodeList = doc.getElementsByTagName("feature");
140
141 hasFeatureTag = true;
142
143 var isTimedElement = nodeList.item(0).getAttributes().getNamedItem("isTimed");
144 boolean isTimed = isTimedElement == null ? network.isTimed() : Boolean.parseBoolean(isTimedElement.getNodeValue());
145
146 var isGameElement = nodeList.item(0).getAttributes().getNamedItem("isGame");
147 boolean isGame = isGameElement == null ? network.hasUncontrollableTransitions() : Boolean.parseBoolean(isGameElement.getNodeValue());
148
149 var isColoredElement = nodeList.item(0).getAttributes().getNamedItem("isColored");
150 boolean isColored = isColoredElement == null ? network.isColored() : Boolean.parseBoolean(isColoredElement.getNodeValue());
151
152 lens = new TAPNLens(isTimed, isGame, isColored);
153 }
154 }
155
156 private void parseFeature(Document doc) {
157 if (doc.getElementsByTagName("feature").getLength() > 0) {
158 NodeList nodeList = doc.getElementsByTagName("feature");
159
160 hasFeatureTag = true;
161
162 var isTimed = Boolean.parseBoolean(nodeList.item(0).getAttributes().getNamedItem("isTimed").getNodeValue());
163 var isGame = Boolean.parseBoolean(nodeList.item(0).getAttributes().getNamedItem("isGame").getNodeValue());
164 var isColored = Boolean.parseBoolean(nodeList.item(0).getAttributes().getNamedItem("isColored").getNodeValue());
165
166 lens = new TAPNLens(isTimed, isGame, isColored);
167 }
168 }
169
170 private void parseSharedPlaces(Document doc, TimedArcPetriNetNetwork network, ConstantStore constants) {
171 NodeList sharedPlaceNodes = doc.getElementsByTagName("shared-place");
172
173 for(int i = 0; i < sharedPlaceNodes.getLength(); i++){
174 Node node = sharedPlaceNodes.item(i);
175
176 if(node instanceof Element){
177 SharedPlace place = parseSharedPlace((Element)node, network, constants);
178 network.add(place);
179 }
180 }
181 }
182
183 private SharedPlace parseSharedPlace(Element element, TimedArcPetriNetNetwork network, ConstantStore constants) {
184 String name = element.getAttribute("name");
185 TimeInvariant invariant = TimeInvariant.parse(element.getAttribute("invariant"), constants);
186 //int numberOfTokens = Integer.parseInt(element.getAttribute("initialMarking"));
187
188 if(name.equalsIgnoreCase("true") || name.equalsIgnoreCase("false")) {
189 name = "_" + name;
190 if(firstPlaceRenameWarning) {
191 messages.add(PLACENAME_ERROR_MESSAGE);
192 firstPlaceRenameWarning = false;
193 }
194 }
195 SharedPlace place = new SharedPlace(name, invariant);
196 place.setCurrentMarking(network.marking());
197 place.setColorType(parsePlaceColorType(element));
198 //place.addTokens(numbesrOfTokens);
199 addColoredDependencies(place,element, network, constants);
200
201
202 return place;
203 }
204
205 private void parseSharedTransitions(Document doc, TimedArcPetriNetNetwork network) {
206 NodeList sharedTransitionNodes = doc.getElementsByTagName("shared-transition");
207
208 for(int i = 0; i < sharedTransitionNodes.getLength(); i++){
209 Node node = sharedTransitionNodes.item(i);
210
211 if(node instanceof Element){
212 SharedTransition transition = parseSharedTransition((Element)node);
213 network.add(transition);
214 }
215 }
216 }
217
218 private SharedTransition parseSharedTransition(Element element) {
219 String name = element.getAttribute("name");
220 boolean urgent = Boolean.parseBoolean(element.getAttribute("urgent"));
221 boolean isUncontrollable = element.getAttribute("player").equals("1");
222
223 SharedTransition st = new SharedTransition(name);
224 st.setUrgent(urgent);
225 st.setUncontrollable(isUncontrollable);
226 return st;
227 }
228
229 private Collection<Template> parseTemplates(Document doc, TimedArcPetriNetNetwork network, ConstantStore constants) throws FormatException {
230 Collection<Template> templates = new ArrayList<Template>();
231 NodeList nets = doc.getElementsByTagName("net");
232
233 if(nets.getLength() <= 0)
234 throw new FormatException("File did not contain any TAPN components.");
235
236 for (int i = 0; i < nets.getLength(); i++) {
237 Template template = parseTimedArcPetriNet(nets.item(i), network, constants);
238 template.setHasPositionalInfo(true); //We assume that all templates have positional info
239 templates.add(template);
240 }
241 return templates;
242 }
243
244 private List<Constant> parseConstants(Document doc) {
245 List<Constant> constants = new ArrayList<Constant>();
246 NodeList constantNodes = doc.getElementsByTagName("constant");
247 for (int i = 0; i < constantNodes.getLength(); i++) {
248 Node c = constantNodes.item(i);
249
250 if (c instanceof Element) {
251 Constant constant = parseConstant((Element) c);
252 constants.add(constant);
253 }
254 }
255 return constants;
256 }
257
258 private Template parseTimedArcPetriNet(Node tapnNode, TimedArcPetriNetNetwork network, ConstantStore constants) throws FormatException {
259 String name = getTAPNName(tapnNode);
260
261 boolean active = getActiveStatus(tapnNode);
262
263 TimedArcPetriNet tapn = new TimedArcPetriNet(name);
264 tapn.setActive(active);
265 network.add(tapn);
266 nameGenerator.add(tapn);
267
268 DataLayer guiModel = new DataLayer();
269 Template template = new Template(tapn, guiModel, new Zoomer());
270
271 NodeList nodeList = tapnNode.getChildNodes();
272 for (int i = 0; i < nodeList.getLength(); i++) {
273
274 Node node = nodeList.item(i);
275 if(node instanceof Element){
276 parseElement((Element)node, template, network, constants);
277 }
278 }
279
280 return template;
281 }
282
283 private boolean getActiveStatus(Node tapnNode) {
284 if (tapnNode instanceof Element) {
285 Element element = (Element)tapnNode;
286 String activeString = element.getAttribute("active");
287
288 if (activeString == null || activeString.equals(""))
289 return true;
290 else
291 return activeString.equals("true");
292 } else {
293 return true;
294 }
295 }
296
297 private void parseElement(Element element, Template template, TimedArcPetriNetNetwork network, ConstantStore constants) throws FormatException {
298 if ("labels".equals(element.getNodeName())) {
299 AnnotationNote note = parseAnnotation(element);
300 template.guiModel().addPetriNetObject(note);
301 } else if ("place".equals(element.getNodeName())) {
302 TimedPlaceComponent place = parsePlace(element, network, template.model(), constants);
303 template.guiModel().addPetriNetObject(place);
304 } else if ("transition".equals(element.getNodeName())) {
305 TimedTransitionComponent transition = parseTransition(element, network, template.model());
306 template.guiModel().addPetriNetObject(transition);
307 } else if (element.getNodeName().matches("arc|outputArc|inputArc|inhibitorArc|transportArc")) {
308 parseAndAddArc(element, template, constants, network);
309 }
310 }
311
312 private boolean isNameAllowed(String name) {
313 Require.that(name != null, "name was null");
314
315 return !name.isEmpty() && java.util.regex.Pattern.matches("[a-zA-Z]([_a-zA-Z0-9])*", name);
316 }
317
318
319 private String getTAPNName(Node tapnNode) {
320 if (tapnNode instanceof Element) {
321 Element element = (Element)tapnNode;
322 String name = element.getAttribute("name");
323
324 if (name == null || name.equals(""))
325 name = element.getAttribute("id");
326
327 if(!isNameAllowed(name)){
328 name = nameGenerator.getNewTemplateName();
329 }
330 nameGenerator.updateTemplateIndex(name);
331 return name;
332 } else {
333 return nameGenerator.getNewTemplateName();
334 }
335 }
336
337 private AnnotationNote parseAnnotation(Element annotation) {
338 int positionXInput = 0;
339 int positionYInput = 0;
340 int widthInput = 0;
341 int heightInput = 0;
342 boolean borderInput = true;
343
344 String positionXTempStorage = annotation.getAttribute("positionX");
345 String positionYTempStorage = annotation.getAttribute("positionY");
346 String widthTemp = annotation.getAttribute("width");
347 String heightTemp = annotation.getAttribute("height");
348 String borderTemp = annotation.getAttribute("border");
349
350 String text = annotation.getTextContent();
351
352 if (positionXTempStorage.length() > 0) {
353 positionXInput = Integer.parseInt(positionXTempStorage) + 1;
354 }
355
356 if (positionYTempStorage.length() > 0) {
357 positionYInput = Integer.parseInt(positionYTempStorage) + 1;
358 }
359
360 if (widthTemp.length() > 0) {
361 widthInput = Integer.parseInt(widthTemp) + 1;
362 }
363
364 if (heightTemp.length() > 0) {
365 heightInput = Integer.parseInt(heightTemp) + 1;
366 }
367
368 if (borderTemp.length() > 0) {
369 borderInput = Boolean.parseBoolean(borderTemp);
370 } else {
371 borderInput = true;
372 }
373 return new AnnotationNote(text, positionXInput, positionYInput, widthInput, heightInput, borderInput);
374 }
375
376 private TimedTransitionComponent parseTransition(Element transition, TimedArcPetriNetNetwork network, TimedArcPetriNet tapn) {
377 String posX = transition.getAttribute("positionX");
378 String posY = transition.getAttribute("positionY");
379 String nameOffsetX = transition.getAttribute("nameOffsetX");
380 String nameOffsetY = transition.getAttribute("nameOffsetY");
381 String angleStr = transition.getAttribute("angle");
382 String priorityStr = transition.getAttribute("priority");
383 int positionXInput = 0;
384 int positionYInput = 0;
385 int nameOffsetXInput = 0;
386 int nameOffsetYInput = 0;
387 int angle = 0;
388 int priority = 0;
389 if(!posX.isEmpty()){
390 positionXInput = (int)Double.parseDouble(posX);
391 }
392 if(!posY.isEmpty()){
393 positionYInput = (int)Double.parseDouble(posY);
394 }
395
396 var g = transition.getElementsByTagName("position");
397 if (g.getLength() > 0) {
398 positionXInput = Integer.parseInt(((Element) g.item(0)).getAttribute("x"));
399 positionYInput = Integer.parseInt(((Element) g.item(0)).getAttribute("y"));
400 }
401
402 if(!nameOffsetX.isEmpty()){
403 nameOffsetXInput = (int)Double.parseDouble(nameOffsetX);
404 }
405 if(!nameOffsetY.isEmpty()){
406 nameOffsetYInput = (int)Double.parseDouble(nameOffsetY);
407 }
408 if(!angleStr.isEmpty()){
409 angle = Integer.parseInt(angleStr);
410 }
411 if(!priorityStr.isEmpty()){
412 priority = Integer.parseInt(priorityStr);
413 }
414 String idInput = transition.getAttribute("id");
415 String nameInput = transition.getAttribute("name");
416 boolean isUrgent = Boolean.parseBoolean(transition.getAttribute("urgent"));
417
418 String player = transition.getAttribute("player");
419
420 idResolver.add(tapn.name(), idInput, nameInput);
421
422 boolean infiniteServer = transition.getAttribute("infiniteServer").equals("true");
423
424 boolean displayName = transition.getAttribute("displayName").equals("false") ? false : true;
425
426
427 if (idInput.length() == 0 && nameInput.length() > 0) {
428 idInput = nameInput;
429 }
430
431 if (nameInput.length() == 0 && idInput.length() > 0) {
432 nameInput = idInput;
433 }
434 GuardExpression guardExpr = null;
435
436 Node conditionNode = getFirstDirectChild(transition, "condition");
437 if (conditionNode != null) {
438 try {
439 guardExpr = loadTACPN.parseGuardExpression(getFirstDirectChild(conditionNode, "structure"));
440 } catch (FormatException e) {
441 e.printStackTrace();
442 }
443 }
444
445 TimedTransition t = new TimedTransition(nameInput, guardExpr);
446 t.setUrgent(isUrgent);
447 t.setUncontrollable(player.equals("1"));
448 if(network.isNameUsedForShared(nameInput)){
449 t.setName(nameGenerator.getNewTransitionName(tapn)); // introduce temporary name to avoid exceptions
450 tapn.add(t);
451 network.getSharedTransitionByName(nameInput).makeShared(t);
452 }else{
453 tapn.add(t);
454 }
455 nameGenerator.updateIndicesForAllModels(nameInput);
456 TimedTransitionComponent transitionComponent = new TimedTransitionComponent(
457 positionXInput, positionYInput, idInput,
458 nameOffsetXInput, nameOffsetYInput,
459 angle, lens);
460 transitionComponent.setUnderlyingTransition(t);
461
462 if (!displayName){
463 transitionComponent.setAttributesVisible(false);
464 }
465 return transitionComponent;
466 }
467
468 private TimedPlaceComponent parsePlace(Element place, TimedArcPetriNetNetwork network, TimedArcPetriNet tapn, ConstantStore constants) {
469 String placePosX = place.getAttribute("positionX");
470 String placePosY = place.getAttribute("positionY");
471 String nameOffsetX = place.getAttribute("nameOffsetX");
472 String nameOffsetY = place.getAttribute("nameOffsetY");
473 int positionXInput = 0;
474 int positionYInput = 0;
475 if(!placePosX.isBlank()){
476 positionXInput = (int)Double.parseDouble(placePosX);
477 }
478 if(!placePosY.isBlank()){
479 positionYInput = (int)Double.parseDouble(placePosY);
480 }
481
482 var g = place.getElementsByTagName("position");
483 if (g.getLength() > 0) {
484 positionXInput = Integer.parseInt(((Element) g.item(0)).getAttribute("x"));
485 positionYInput = Integer.parseInt(((Element) g.item(0)).getAttribute("y"));
486 }
487
488 String idInput = place.getAttribute("id");
489 String nameInput = place.getAttribute("name");
490
491 int nameOffsetXInput = 0;
492 int nameOffsetYInput = 0;
493 if(!nameOffsetX.isEmpty()){
494 nameOffsetXInput = (int)Double.parseDouble(nameOffsetX);
495 }
496 if(!nameOffsetY.isEmpty()){
497 nameOffsetYInput = (int)Double.parseDouble(nameOffsetY);
498 }
499
500 String invariant = place.getAttribute("invariant");
501 boolean displayName = place.getAttribute("displayName").equals("false") ? false : true;
502
503 if (idInput.length() == 0 && nameInput.length() > 0) {
504 idInput = nameInput;
505 }
506
507 if (nameInput.length() == 0 && idInput.length() > 0) {
508 nameInput = idInput;
509 }
510
511 if(nameInput.equalsIgnoreCase("true") || nameInput.equalsIgnoreCase("false")) {
512 nameInput = "_" + nameInput;
513 if(firstPlaceRenameWarning) {
514 messages.add(PLACENAME_ERROR_MESSAGE);
515 firstPlaceRenameWarning = false;
516 }
517 }
518
519 idResolver.add(tapn.name(), idInput, nameInput);
520
521 TimedPlace p;
522 if(network.isNameUsedForShared(nameInput)){
523 p = network.getSharedPlaceByName(nameInput);
524 tapn.add(p);
525 }else{
526 p = new LocalTimedPlace(nameInput, TimeInvariant.parse(invariant, constants), parsePlaceColorType(place));
527 tapn.add(p);
528 addColoredDependencies(p,place, network, constants);
529
530 }
531 nameGenerator.updateIndicesForAllModels(nameInput);
532 TimedPlaceComponent placeComponent = new TimedPlaceComponent(positionXInput, positionYInput, idInput, nameOffsetXInput, nameOffsetYInput, lens);
533 placeComponent.setUnderlyingPlace(p);
534
535 if (!displayName){
536 placeComponent.setAttributesVisible(false);
537 }
538
539 return placeComponent;
540 }
541
542 private ColorType parsePlaceColorType(Element element){
543 ColorType ct = ColorType.COLORTYPE_DOT;
544 Node typeNode = element.getElementsByTagName("type").item(0);
545 if (typeNode != null) {
546 try {
547 ct = loadTACPN.parseUserSort(typeNode);
548 } catch (FormatException e) {
549 e.printStackTrace();
550 }
551 }
552 return ct;
553 }
554
555 private void addColoredDependencies(TimedPlace p, Element place, TimedArcPetriNetNetwork network, ConstantStore constants){
556 List<ColoredTimeInvariant> ctiList = new ArrayList<ColoredTimeInvariant>();
557 int initialMarkingInput = Integer.parseInt(place.getAttribute("initialMarking"));
558
559 ArcExpression colorMarking = null;
560 NodeList nodes = place.getElementsByTagName("colorinvariant");
561 if (nodes != null) {
562 for (int i = 0; i < nodes.getLength(); i++) {
563 Pair<String, Vector<Color>> pair = parseColorInvariant((Element) nodes.item(i), network);
564 ColoredTimeInvariant cti = ColoredTimeInvariant.parse(pair.getFirst(), constants, pair.getSecond());
565 ctiList.add(cti);
566 }
567 }
568 if (place.getAttribute("inscription").length() > 0) {
569 ctiList.add(ColoredTimeInvariant.parse(place.getAttribute("inscription"), constants, new Vector<Color>() {{
570 add(Color.STAR_COLOR);
571 }}));
572 }
573 Node hlInitialMarkingNode = place.getElementsByTagName("hlinitialMarking").item(0);
574
575 if (hlInitialMarkingNode instanceof Element) {
576 try {
577 colorMarking = loadTACPN.parseArcExpression(((Element)hlInitialMarkingNode).getElementsByTagName("structure").item(0));
578 } catch (FormatException e) {
579 e.printStackTrace();
580 }
581 }
582
583
584 p.setCtiList(ctiList);
585 ExpressionContext context = new ExpressionContext(new HashMap<String, Color>(), loadTACPN.getColortypes());
586 if(colorMarking!= null){
587 ColorMultiset cm = colorMarking.eval(context);
588
589 p.setTokenExpression(loadTACPN.constructCleanAddExpression(p.getColorType(),cm));
590
591
592 for (TimedToken ctElement : cm.getTokens(p)) {
593 network.marking().add(ctElement);
594 //p.addToken(ctElement);
595 }
596
597 } else {
598 for (int i = 0; i < initialMarkingInput; i++) {
599 //Regular tokens will just be dotconstant
600 network.marking().add(new TimedToken(p, ColorType.COLORTYPE_DOT.getFirstColor()));
601 }
602 if(initialMarkingInput > 1) {
603 Vector<ColorExpression> v = new Vector<>();
604 v.add(new DotConstantExpression());
605 Vector<ArcExpression> numbOfExpression = new Vector<>();
606 numbOfExpression.add(new NumberOfExpression(initialMarkingInput, v));
607 p.setTokenExpression(new AddExpression(numbOfExpression));
608 }
609 }
610 }
611
612 private void parseAndAddArc(Element arc, Template template, ConstantStore constants, TimedArcPetriNetNetwork network) throws FormatException {
613 String idInput = arc.getAttribute("id");
614 String sourceInput = arc.getAttribute("source");
615 String targetInput = arc.getAttribute("target");
616 boolean taggedArc = arc.getAttribute("tagged").equals("true") ? true : false;
617 String inscriptionTempStorage = arc.getAttribute("inscription");
618 String type = arc.getAttribute("type");
619 if(type.isEmpty()){
620 switch (arc.getNodeName()) {
621 case "transportArc":
622 type = "transport";
623 break;
624 case "inhibitorArc":
625 type = "inhibitor";
626 break;
627 case "inputArc":
628 type = "timed";
629 break;
630 default:
631 type = "";
632 break;
633 }
634 }
635 int nameOffsetXInput;
636 int nameOffsetYInput;
637
638 //This check is done, as arcs in nets saved before this change do not have a nameOffset
639 if(!arc.getAttribute("nameOffsetX").equals("") && !arc.getAttribute("nameOffsetY").equals("")) {
640 nameOffsetXInput = (int) Double.parseDouble(arc.getAttribute("nameOffsetX"));
641 nameOffsetYInput = (int) Double.parseDouble(arc.getAttribute("nameOffsetY"));
642 } else {
643 nameOffsetXInput = 0;
644 nameOffsetYInput = 0;
645 }
646
647 sourceInput = idResolver.get(template.model().name(), sourceInput);
648 targetInput = idResolver.get(template.model().name(), targetInput);
649
650 PlaceTransitionObject sourceIn = template.guiModel().getPlaceTransitionObject(sourceInput);
651 PlaceTransitionObject targetIn = template.guiModel().getPlaceTransitionObject(targetInput);
652
653 // add the insets and offset
654 int _startx = sourceIn.getX() + sourceIn.centreOffsetLeft();
655 int _starty = sourceIn.getY() + sourceIn.centreOffsetTop();
656
657 int _endx = targetIn.getX() + targetIn.centreOffsetLeft();
658 int _endy = targetIn.getY() + targetIn.centreOffsetTop();
659
660 //Get weight if any
661 Weight weight = new IntWeight(1);
662 if(arc.hasAttribute("weight")){
663 weight = Weight.parseWeight(arc.getAttribute("weight"), constants);
664 }
665 ArcExpression arcExpr = null;
666 List<ColoredTimeInterval> ctiList = new ArrayList<ColoredTimeInterval>();
667 Node hlInscription = getFirstDirectChild(arc, "hlinscription");
668 if (hlInscription != null)
669 hlInscription = getFirstDirectChild(hlInscription, "structure");
670 if (hlInscription != null)
671 arcExpr = loadTACPN.parseArcExpression(hlInscription);
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches