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
1=== modified file 'build.gradle'
2--- build.gradle 2021-08-11 11:19:19 +0000
3+++ build.gradle 2022-07-21 13:30:11 +0000
4@@ -1,94 +1,70 @@
5 plugins {
6 id 'java'
7 id 'application'
8- id 'org.jetbrains.kotlin.jvm' version '1.3.71'
9+ id 'org.jetbrains.kotlin.jvm' version '1.6.10'
10+ id 'org.jetbrains.kotlin.plugin.serialization' version '1.6.10'
11 id "ca.coglinc.javacc" version "2.4.0"
12 }
13
14 group 'net.tapaal'
15 version '4.0-SNAPSHOT'
16
17+var targetJavaVersion = JavaVersion.VERSION_11
18+var targetKotlinVersion = "1.6"
19 java {
20- sourceCompatibility = JavaVersion.VERSION_11
21- targetCompatibility = JavaVersion.VERSION_11
22-}
23+ sourceCompatibility = targetJavaVersion
24+ targetCompatibility = targetJavaVersion
25+}
26+
27+compileKotlin {
28+ sourceCompatibility = targetJavaVersion
29+ targetCompatibility = targetJavaVersion
30+
31+ kotlinOptions {
32+ jvmTarget = targetJavaVersion
33+ apiVersion = targetKotlinVersion
34+ languageVersion = targetKotlinVersion
35+ }
36+}
37+
38+mainClassName = 'TAPAAL'
39
40 repositories {
41 mavenCentral()
42 }
43
44-compileJavacc {
45- inputDirectory = file('src/')
46- //outputDirectory = file(project.buildDir.absolutePath + '/generated/javacc')
47-}
48-
49-//Set the soruce and resource dir
50 sourceSets {
51 main {
52 java {
53- srcDirs = ['src/', compileJavacc.outputDirectory]
54- exclude("resources/")
55- }
56- resources {
57- //Resources should be in folder called resources, so only add the resources folder
58- //adding srv/resources will places content of the folder in root of jar file
59- srcDirs = ['src/']
60- include("resources/")
61- }
62- test {
63- java {
64- srcDirs = ['tests/']
65- }
66+ srcDir compileJavacc.outputDirectory
67 }
68 }
69 }
70
71-mainClassName = 'TAPAAL'
72-
73 jar {
74 exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'
75
76 //Sets the main call for the Jar, you can double click to run the jar file
77 manifest {
78- attributes 'Main-Class': 'TAPAAL'
79+ attributes (
80+ 'Main-Class': mainClassName
81+ )
82 }
83 //The following lines makes libs a part of the build jar file (standalone jar)
84 //from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
85 }
86
87 dependencies {
88- implementation group: 'commons-cli', name: 'commons-cli', version: '1.4'
89- implementation group: 'org.swinglabs.swingx', name: 'swingx-all', version: '1.6.5-1'
90- implementation group: 'net.java.dev.jna', name: 'jna', version: '4.5.1'
91- implementation 'org.jetbrains:annotations:16.0.2'
92- //compile group: 'com.apple', name: 'AppleJavaExtensions', version: '1.4' // Not working
93-
94- //Add jars from libs dir
95- implementation fileTree(dir: 'libs', include: ['*.jar'])
96-
97- //Junit
98- testImplementation(
99- 'org.junit.jupiter:junit-jupiter-api:5.4.2'
100- )
101- testRuntimeOnly(
102- 'org.junit.jupiter:junit-jupiter-engine:5.4.2',
103- 'org.junit.vintage:junit-vintage-engine:5.4.2'
104- )
105- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
106+ implementation 'commons-cli:commons-cli:1.5.0'
107+ implementation 'org.swinglabs.swingx:swingx-all:1.6.5-1'
108+ implementation 'net.java.dev.jna:jna:5.11.0'
109+ implementation 'org.jetbrains:annotations:23.0.0'
110+ implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.3'
111+
112+ testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
113+ testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
114 }
115+
116 test {
117 useJUnitPlatform()
118- afterTest { desc, result ->
119- logger.quiet "Executing test ${desc.name} [${desc.className}] with result: ${result.resultType}"
120- }
121-}
122-compileKotlin {
123- kotlinOptions {
124- jvmTarget = JavaVersion.VERSION_11
125- }
126-}
127-compileTestKotlin {
128- kotlinOptions {
129- jvmTarget = JavaVersion.VERSION_11
130- }
131 }
132
133=== modified file 'gradle/wrapper/gradle-wrapper.jar'
134Binary files gradle/wrapper/gradle-wrapper.jar and gradle/wrapper/gradle-wrapper.jar differ
135=== modified file 'gradle/wrapper/gradle-wrapper.properties'
136--- gradle/wrapper/gradle-wrapper.properties 2020-04-06 12:41:08 +0000
137+++ gradle/wrapper/gradle-wrapper.properties 2022-07-21 13:30:11 +0000
138@@ -1,6 +1,5 @@
139-#Mon Apr 06 14:40:09 CEST 2020
140-distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip
141-distributionBase=GRADLE_USER_HOME
142-distributionPath=wrapper/dists
143-zipStorePath=wrapper/dists
144-zipStoreBase=GRADLE_USER_HOME
145+distributionBase=GRADLE_USER_HOME
146+distributionPath=wrapper/dists
147+distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
148+zipStoreBase=GRADLE_USER_HOME
149+zipStorePath=wrapper/dists
150
151=== modified file 'gradlew'
152--- gradlew 2020-09-01 08:14:52 +0000
153+++ gradlew 2022-07-21 13:30:11 +0000
154@@ -82,6 +82,7 @@
155
156 CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
157
158+
159 # Determine the Java command to use to start the JVM.
160 if [ -n "$JAVA_HOME" ] ; then
161 if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
162@@ -129,6 +130,7 @@
163 if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
164 APP_HOME=`cygpath --path --mixed "$APP_HOME"`
165 CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
166+
167 JAVACMD=`cygpath --unix "$JAVACMD"`
168
169 # We build the pattern for arguments to be converted via cygpath
170
171=== modified file 'gradlew.bat'
172--- gradlew.bat 2020-03-28 10:29:30 +0000
173+++ gradlew.bat 2022-07-21 13:30:11 +0000
174@@ -40,7 +40,7 @@
175
176 set JAVA_EXE=java.exe
177 %JAVA_EXE% -version >NUL 2>&1
178-if "%ERRORLEVEL%" == "0" goto init
179+if "%ERRORLEVEL%" == "0" goto execute
180
181 echo.
182 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
183@@ -54,7 +54,7 @@
184 set JAVA_HOME=%JAVA_HOME:"=%
185 set JAVA_EXE=%JAVA_HOME%/bin/java.exe
186
187-if exist "%JAVA_EXE%" goto init
188+if exist "%JAVA_EXE%" goto execute
189
190 echo.
191 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
192@@ -64,28 +64,14 @@
193
194 goto fail
195
196-:init
197-@rem Get command-line arguments, handling Windows variants
198-
199-if not "%OS%" == "Windows_NT" goto win9xME_args
200-
201-:win9xME_args
202-@rem Slurp the command line arguments.
203-set CMD_LINE_ARGS=
204-set _SKIP=2
205-
206-:win9xME_args_slurp
207-if "x%~1" == "x" goto execute
208-
209-set CMD_LINE_ARGS=%*
210-
211 :execute
212 @rem Setup the command line
213
214 set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
215
216+
217 @rem Execute Gradle
218-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
219+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
220
221 :end
222 @rem End local scope for the variables with windows NT shell
223
224=== removed directory 'src/dk/aau/cs/gui'
225=== removed directory 'src/dk/aau/cs/gui/components'
226=== removed directory 'src/dk/aau/cs/gui/components/handlers'
227=== removed directory 'src/dk/aau/cs/gui/smartDraw'
228=== removed directory 'src/dk/aau/cs/gui/undo'
229=== removed file 'src/dk/aau/cs/util/ExecutabilityChecker.java'
230--- src/dk/aau/cs/util/ExecutabilityChecker.java 2016-03-16 18:05:19 +0000
231+++ src/dk/aau/cs/util/ExecutabilityChecker.java 1970-01-01 00:00:00 +0000
232@@ -1,42 +0,0 @@
233-package dk.aau.cs.util;
234-
235-import java.io.BufferedReader;
236-import java.io.InputStream;
237-import java.io.InputStreamReader;
238-
239-public class ExecutabilityChecker {
240- public static void check(String path) throws IllegalArgumentException{
241- int rcode = -1;
242- try {
243- Process p = Runtime.getRuntime().exec(new String[] { path, "-v" });
244-
245- // Because some native platforms only provide limited buffer size
246- // for standard input and output streams, failure to promptly write
247- // the input stream or read the output stream of the subprocess may
248- // cause the subprocess to block, and even deadlock.
249-
250- InputStream stream = p.getInputStream();
251- InputStreamReader isr = new InputStreamReader(stream);
252- BufferedReader br = new BufferedReader(isr);
253- while (br.readLine() != null){}
254-
255- stream = p.getErrorStream();
256- isr = new InputStreamReader(stream);
257- br = new BufferedReader(isr);
258- while (br.readLine() != null){}
259-
260- rcode = p.waitFor(); // Requires binary to accept -v flag
261- } catch (Exception e) {
262- // Do nothing
263- }
264- // Detect executable issues
265- switch(rcode){
266- case 0:
267- break;
268- case 126:
269- throw new IllegalArgumentException("The selected file is not executable on this system.");
270- default:
271- throw new IllegalArgumentException("The selected file is not executable or not compatible with your system (return value "+rcode+").");
272- }
273- }
274-}
275\ No newline at end of file
276
277=== added directory 'src/main'
278=== added directory 'src/main/java'
279=== renamed file 'src/TAPAAL.java' => 'src/main/java/TAPAAL.java'
280=== renamed directory 'src/dk' => 'src/main/java/dk'
281=== modified file 'src/main/java/dk/aau/cs/TCTL/AritmeticOperator.java'
282--- src/dk/aau/cs/TCTL/AritmeticOperator.java 2020-11-06 19:41:50 +0000
283+++ src/main/java/dk/aau/cs/TCTL/AritmeticOperator.java 2022-07-21 13:30:11 +0000
284@@ -4,7 +4,7 @@
285
286 public class AritmeticOperator extends TCTLAbstractStateProperty {
287
288- String operator;
289+ final String operator;
290
291 public AritmeticOperator(String operator) {
292 this.operator = operator;
293
294=== modified file 'src/main/java/dk/aau/cs/TCTL/LTLGNode.java'
295--- src/dk/aau/cs/TCTL/LTLGNode.java 2021-10-08 06:26:14 +0000
296+++ src/main/java/dk/aau/cs/TCTL/LTLGNode.java 2022-07-21 13:30:11 +0000
297@@ -20,7 +20,7 @@
298 }
299
300 public LTLGNode() {
301- this.property = new TCTLStatePlaceHolder();;
302+ this.property = new TCTLStatePlaceHolder();
303 this.property.setParent(this);
304 }
305
306
307=== modified file 'src/main/java/dk/aau/cs/TCTL/LTLUNode.java'
308--- src/dk/aau/cs/TCTL/LTLUNode.java 2021-10-08 06:26:14 +0000
309+++ src/main/java/dk/aau/cs/TCTL/LTLUNode.java 2022-07-21 13:30:11 +0000
310@@ -54,7 +54,7 @@
311 StringPosition leftPos = new StringPosition(leftStart, leftEnd, left);
312
313 int rightStart = right.isSimpleProperty() ? 0 : 1;
314- rightStart += leftEnd + 3 + + (left.isSimpleProperty() ? 0 : 1);
315+ rightStart += leftEnd + 3 + (left.isSimpleProperty() ? 0 : 1);
316 int rightEnd = rightStart + right.toString().length();
317 StringPosition rightPos = new StringPosition(rightStart, rightEnd, right);
318
319
320=== modified file 'src/main/java/dk/aau/cs/TCTL/StringPosition.java'
321--- src/dk/aau/cs/TCTL/StringPosition.java 2011-02-03 19:03:15 +0000
322+++ src/main/java/dk/aau/cs/TCTL/StringPosition.java 2022-07-21 13:30:11 +0000
323@@ -4,10 +4,9 @@
324
325 private int startIndex;
326 private int endIndex;
327- private TCTLAbstractProperty object;
328+ private final TCTLAbstractProperty object;
329
330- public StringPosition(int startIndex, int endIndex,
331- TCTLAbstractProperty object) {
332+ public StringPosition(int startIndex, int endIndex, TCTLAbstractProperty object) {
333 this.startIndex = startIndex;
334 this.endIndex = endIndex;
335 this.object = object;
336
337=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLAUNode.java'
338--- src/dk/aau/cs/TCTL/TCTLAUNode.java 2020-11-06 19:41:50 +0000
339+++ src/main/java/dk/aau/cs/TCTL/TCTLAUNode.java 2022-07-21 13:30:11 +0000
340@@ -50,7 +50,7 @@
341 StringPosition leftPos = new StringPosition(leftStart, leftEnd, left);
342
343 int rightStart = right.isSimpleProperty() ? 0 : 1;
344- rightStart += leftEnd + 3 + + (left.isSimpleProperty() ? 0 : 1);
345+ rightStart += leftEnd + 3 + (left.isSimpleProperty() ? 0 : 1);
346 int rightEnd = rightStart + right.toString().length();
347 StringPosition rightPos = new StringPosition(rightStart, rightEnd, right);
348
349
350=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLAbstractProperty.java'
351--- src/dk/aau/cs/TCTL/TCTLAbstractProperty.java 2021-08-16 07:29:37 +0000
352+++ src/main/java/dk/aau/cs/TCTL/TCTLAbstractProperty.java 2022-07-21 13:30:11 +0000
353@@ -2,8 +2,6 @@
354
355 import dk.aau.cs.TCTL.visitors.ITCTLVisitor;
356
357-import java.util.Locale;
358-
359 public abstract class TCTLAbstractProperty {
360
361 // used to determine whether to put parenthesis around the property
362
363=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLAbstractStateProperty.java'
364--- src/dk/aau/cs/TCTL/TCTLAbstractStateProperty.java 2011-02-03 19:03:15 +0000
365+++ src/main/java/dk/aau/cs/TCTL/TCTLAbstractStateProperty.java 2022-07-21 13:30:11 +0000
366@@ -18,18 +18,4 @@
367
368 @Override
369 public abstract TCTLAbstractStateProperty copy();
370-
371- // public abstract void accept(ICSLVisitor visitor) throws
372- // ModelCheckingException;
373-
374- // protected abstract void setCompositionality(boolean
375- // withinSteadyStateOperator);
376-
377- // public void setCompositionality() {
378- // setCompositionality(false);
379- // }
380- //
381- // public boolean isCompositional() {
382- // return isCompositional;
383- // }
384 }
385
386=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLAndListNode.java'
387--- src/dk/aau/cs/TCTL/TCTLAndListNode.java 2020-11-06 19:41:50 +0000
388+++ src/main/java/dk/aau/cs/TCTL/TCTLAndListNode.java 2022-07-21 13:30:11 +0000
389@@ -77,8 +77,7 @@
390 s.append(" and ");
391 }
392
393- s.append(prop.isSimpleProperty() ? prop.toString() : "("
394- + prop.toString() + ")");
395+ s.append(prop.isSimpleProperty() ? prop.toString() : "(" + prop + ")");
396 firstTime = false;
397 }
398
399
400=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLAtomicPropositionNode.java'
401--- src/dk/aau/cs/TCTL/TCTLAtomicPropositionNode.java 2020-11-06 19:41:50 +0000
402+++ src/main/java/dk/aau/cs/TCTL/TCTLAtomicPropositionNode.java 2022-07-21 13:30:11 +0000
403@@ -94,31 +94,6 @@
404 return false;
405 }
406
407-/* @Override
408- public StringPosition[] getChildren() {
409- StringPosition[] children = new StringPosition[2];
410-
411- int start = 0;
412- int end = 0;
413- boolean leftSimpleProperty = left.isSimpleProperty();
414-
415- start = leftSimpleProperty ? 0 : 1;
416- end = start + left.toString().length();
417-
418- StringPosition posLeft = new StringPosition(start, end, left);
419-
420- start = end + 5 + (right.isSimpleProperty() ? 0 : 1)
421- + (leftSimpleProperty ? 0 : 1);
422-
423- end = start + right.toString().length();
424-
425- StringPosition posRight = new StringPosition(start, end, right);
426-
427- children[0] = posLeft;
428- children[1] = posRight;
429- return children;
430- }*/
431-
432 @Override
433 public TCTLAbstractProperty findFirstPlaceHolder() {
434 TCTLAbstractProperty rightP = right.findFirstPlaceHolder();
435
436=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLConstNode.java'
437--- src/dk/aau/cs/TCTL/TCTLConstNode.java 2020-11-06 19:41:50 +0000
438+++ src/main/java/dk/aau/cs/TCTL/TCTLConstNode.java 2022-07-21 13:30:11 +0000
439@@ -4,7 +4,7 @@
440
441 public class TCTLConstNode extends TCTLAbstractStateProperty {
442
443- int constant;
444+ final int constant;
445
446 public TCTLConstNode(int constant) {
447 this.constant = constant;
448
449=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLEFNode.java'
450--- src/dk/aau/cs/TCTL/TCTLEFNode.java 2021-09-14 20:13:01 +0000
451+++ src/main/java/dk/aau/cs/TCTL/TCTLEFNode.java 2022-07-21 13:30:11 +0000
452@@ -2,8 +2,6 @@
453
454 import dk.aau.cs.TCTL.visitors.ITCTLVisitor;
455
456-import java.util.HashMap;
457-
458 public class TCTLEFNode extends TCTLAbstractPathProperty {
459
460 private TCTLAbstractStateProperty property;
461
462=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLOrListNode.java'
463--- src/dk/aau/cs/TCTL/TCTLOrListNode.java 2020-11-06 19:41:50 +0000
464+++ src/main/java/dk/aau/cs/TCTL/TCTLOrListNode.java 2022-07-21 13:30:11 +0000
465@@ -77,8 +77,7 @@
466 s.append(" or ");
467 }
468
469- s.append(prop.isSimpleProperty() ? prop.toString() : "("
470- + prop.toString() + ")");
471+ s.append(prop.isSimpleProperty() ? prop.toString() : "(" + prop + ")");
472 firstTime = false;
473 }
474
475
476=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLPlusListNode.java'
477--- src/dk/aau/cs/TCTL/TCTLPlusListNode.java 2020-11-06 19:41:50 +0000
478+++ src/main/java/dk/aau/cs/TCTL/TCTLPlusListNode.java 2022-07-21 13:30:11 +0000
479@@ -8,7 +8,7 @@
480 //Represents a list of terms and the operators between then, these are all stored in the terms list
481 public class TCTLPlusListNode extends TCTLAbstractStateProperty {
482
483- ArrayList<TCTLAbstractStateProperty> terms;
484+ final ArrayList<TCTLAbstractStateProperty> terms;
485
486 public TCTLPlusListNode(ArrayList<TCTLAbstractStateProperty> terms) {
487 this.terms = terms;
488
489=== modified file 'src/main/java/dk/aau/cs/TCTL/TCTLTermListNode.java'
490--- src/dk/aau/cs/TCTL/TCTLTermListNode.java 2020-11-06 19:41:50 +0000
491+++ src/main/java/dk/aau/cs/TCTL/TCTLTermListNode.java 2022-07-21 13:30:11 +0000
492@@ -8,7 +8,7 @@
493 //Represents a list of factors and the operators between then, these are all stored in the factors list
494 public class TCTLTermListNode extends TCTLAbstractStateProperty {
495
496- ArrayList<TCTLAbstractStateProperty> factors;
497+ final ArrayList<TCTLAbstractStateProperty> factors;
498
499 public TCTLTermListNode(ArrayList<TCTLAbstractStateProperty> factors) {
500 this.factors = factors;
501
502=== modified file 'src/main/java/dk/aau/cs/TCTL/XMLParsing/XMLCTLQueryParser.java'
503--- src/dk/aau/cs/TCTL/XMLParsing/XMLCTLQueryParser.java 2017-05-14 19:42:09 +0000
504+++ src/main/java/dk/aau/cs/TCTL/XMLParsing/XMLCTLQueryParser.java 2022-07-21 13:30:11 +0000
505@@ -44,9 +44,9 @@
506 XMLCTLQueryParser parser = new XMLCTLQueryParser(prop, queryWrapper);
507 queryWrapper.setName(parser.parsePropertyName());
508
509- try{
510+ try {
511 queryWrapper.setProp(parser.AbstractProperty());
512- } catch (XMLQueryParseException e){
513+ } catch (XMLQueryParseException e) {
514 queryWrapper.setException(e);
515 Logger.log(e);
516 return false;
517@@ -87,14 +87,14 @@
518 }
519
520 private TCTLAbstractProperty parseFormula(Node property)
521- throws XMLQueryParseException{
522+ throws XMLQueryParseException {
523
524 TCTLAbstractProperty childProperty;
525 Node child = getFirstChildNode(property);
526 String nodeName = property.getNodeName();
527
528 String childNodeName = "";
529- if(child != null){
530+ if (child != null) {
531 childNodeName = child.getNodeName();
532 }
533
534@@ -366,38 +366,40 @@
535 } else if(nodeName.equals("integer-ge")){
536 return new TCTLAtomicPropositionNode(subformula1, ">=", subformula2);
537 }
538- } else if (nodeName.equals("is-fireable")){
539- // Construct a nested disjunction of transitions.
540-
541- children = getAllChildren(property);
542-
543- if(children.isEmpty()){
544+ } else if (nodeName.equals("is-fireable")) {
545+ // Construct a nested disjunction of transitions.
546+
547+ children = getAllChildren(property);
548+
549+ if (children.isEmpty()) {
550 throw new XMLQueryParseException(ERROR_MESSAGE + nodeName);
551- } else if(children.size() == 1) {
552- String[] splits = getText(children.get(0)).replace("\n", "").split("\\.");
553-
554- // Check if transition contains a template name
555- if(splits.length > 1){
556- return new TCTLTransitionNode(splits[0], splits[1]);
557+ } else if (children.size() == 1) {
558+ String[] splits = getText(children.get(0)).replace("\n", "").split("\\.");
559+
560+ // Check if transition contains a template name
561+ if (splits.length > 1) {
562+ return new TCTLTransitionNode(splits[0], splits[1]);
563 } else {
564- return new TCTLTransitionNode(splits[0]);
565- }
566- } else {
567- ArrayList<TCTLAbstractStateProperty> transitions = new ArrayList<TCTLAbstractStateProperty>();
568-
569- for(Node n : children) {
570- String[] splits = getText(n).replace("\n", "").split("\\.");
571-
572- // Check if transition contains a template name
573- if(splits.length > 1){
574- transitions.add(new TCTLTransitionNode(splits[0], splits[1]));
575- } else {
576- transitions.add(new TCTLTransitionNode(splits[0]));
577- }
578- }
579- return new TCTLOrListNode(transitions);
580- }
581- } else{
582+ return new TCTLTransitionNode(splits[0]);
583+ }
584+ } else {
585+ ArrayList<TCTLAbstractStateProperty> transitions = new ArrayList<TCTLAbstractStateProperty>();
586+
587+ for (Node n : children) {
588+ String[] splits = getText(n).replace("\n", "").split("\\.");
589+
590+ // Check if transition contains a template name
591+ if (splits.length > 1) {
592+ transitions.add(new TCTLTransitionNode(splits[0], splits[1]));
593+ } else {
594+ transitions.add(new TCTLTransitionNode(splits[0]));
595+ }
596+ }
597+ return new TCTLOrListNode(transitions);
598+ }
599+ } else if (nodeName.equals("control")) {
600+ return parseFormula(child);
601+ }else{
602 parseFormula(property);
603 }
604
605
606=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/AddTemplateVisitor.java'
607--- src/dk/aau/cs/TCTL/visitors/AddTemplateVisitor.java 2014-05-22 20:26:41 +0000
608+++ src/main/java/dk/aau/cs/TCTL/visitors/AddTemplateVisitor.java 2022-07-21 13:30:11 +0000
609@@ -3,7 +3,7 @@
610 import dk.aau.cs.TCTL.TCTLPlaceNode;
611
612 public class AddTemplateVisitor extends VisitorBase {
613- private String templateName;
614+ private final String templateName;
615
616 public AddTemplateVisitor(String templateName) {
617 this.templateName = templateName;
618
619=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/BroadcastTranslationQueryVisitor.java'
620--- src/dk/aau/cs/TCTL/visitors/BroadcastTranslationQueryVisitor.java 2019-03-22 10:13:18 +0000
621+++ src/main/java/dk/aau/cs/TCTL/visitors/BroadcastTranslationQueryVisitor.java 2022-07-21 13:30:11 +0000
622@@ -7,8 +7,8 @@
623 protected static final String PLOCK = "P_lock";
624 protected static final String TOKEN_TEMPLATE_NAME = "Token";
625
626- private boolean useSymmetry;
627- private int totalTokens;
628+ private final boolean useSymmetry;
629+ private final int totalTokens;
630
631 public BroadcastTranslationQueryVisitor(boolean useSymmetry, int totalTokens) {
632 this.useSymmetry = useSymmetry;
633
634=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/CTLQueryVisitor.java'
635--- src/dk/aau/cs/TCTL/visitors/CTLQueryVisitor.java 2021-10-08 06:22:05 +0000
636+++ src/main/java/dk/aau/cs/TCTL/visitors/CTLQueryVisitor.java 2022-07-21 13:30:11 +0000
637@@ -1,271 +1,288 @@
638 package dk.aau.cs.TCTL.visitors;
639
640-import java.util.List;
641-
642 import dk.aau.cs.TCTL.*;
643 import dk.aau.cs.io.XMLFormatter;
644
645+import java.util.List;
646+
647 public class CTLQueryVisitor extends VisitorBase {
648-
649- private static final String XML_NS = "xmlns=\"http://tapaal.net/\"";
650- private static final String XML_PROPSET = "property-set";
651- private static final String XML_PROP = "property";
652- private static final String XML_PROPID = "id";
653- private static final String XML_PROPDESC = "description";
654- private static final String XML_FORMULA = "formula";
655- private static final String XML_ALLPATHS = "all-paths";
656- private static final String XML_EXISTSPATH = "exists-path";
657- private static final String XML_NEGATION = "negation";
658- private static final String XML_CONJUNCTION = "conjunction";
659- private static final String XML_DISJUNCTION = "disjunction";
660- private static final String XML_GLOBALLY = "globally";
661- private static final String XML_FINALLY = "finally";
662- private static final String XML_NEXT = "next";
663- private static final String XML_UNTIL = "until";
664- private static final String XML_BEFORE = "before";
665- private static final String XML_REACH = "reach";
666- private static final String XML_DEADLOCK = "deadlock";
667- private static final String XML_TRUE = "true";
668- private static final String XML_FALSE = "false";
669- private static final String XML_INTEGERLT = "integer-lt";
670- private static final String XML_INTEGERLE = "integer-le";
671- private static final String XML_INTEGEREQ = "integer-eq";
672- private static final String XML_INTEGERNE = "integer-ne";
673- private static final String XML_INTEGERGT = "integer-gt";
674- private static final String XML_INTEGERGE = "integer-ge";
675- private static final String XML_ISFIREABLE = "is-fireable";
676- private static final String XML_INTEGERCONSTANT = "integer-constant";
677- private static final String XML_TOKENSCOUNT = "tokens-count";
678- private static final String XML_PLACE = "place";
679- private static final String XML_TRANSITION = "transition";
680- private static final String XML_INTEGERSUM = "integer-sum";
681- private static final String XML_INTEGERPRODUCT = "integer-product";
682- private static final String XML_INTEGERDIFFERENCE = "integer-difference";
683-
684- private StringBuffer XMLQuery;
685-
686- public CTLQueryVisitor() {
687- this.XMLQuery = new StringBuffer();
688- }
689-
690- public String getXMLQueryFor(TCTLAbstractProperty property, String queryName) {
691- buildXMLQuery(property, queryName);
692- return getFormatted();
693- }
694-
695- public void buildXMLQuery(TCTLAbstractProperty property, String queryName) {
696- XMLQuery.append(startTag(XML_PROP) + queryInfo(queryName) + startTag(XML_FORMULA));
697- property.accept(this, null);
698- XMLQuery.append(endTag(XML_FORMULA) + endTag(XML_PROP));
699- }
700-
701- public String getFormatted() {
702- XMLFormatter formatter = new XMLFormatter();
703- return formatter.format(getStartTag() + XMLQuery.toString() + getEndTag());
704- }
705-
706- public StringBuffer getXMLQuery() {
707- return XMLQuery;
708- }
709-
710- public String getStartTag(){
711- return startTag(XML_PROPSET + " " + XML_NS) + "\n";
712- }
713-
714- public String getEndTag(){
715- return endTag(XML_PROPSET) + "\n";
716- }
717-
718- private String queryInfo(String queryName){
719- String nameToPrint = (queryName == null) ? "Query Comment/Name Here" : queryName;
720- return wrapInTag(nameToPrint, XML_PROPID) + wrapInTag(nameToPrint, XML_PROPDESC);
721- }
722-
723- public void visit(TCTLAFNode afNode, Object context) {
724- XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_FINALLY));
725- afNode.getProperty().accept(this, context);
726- XMLQuery.append(endTag(XML_FINALLY) + endTag(XML_ALLPATHS));
727- }
728-
729- public void visit(TCTLAGNode agNode, Object context) {
730- XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_GLOBALLY));
731- agNode.getProperty().accept(this, context);
732- XMLQuery.append(endTag(XML_GLOBALLY) + endTag(XML_ALLPATHS));
733- }
734-
735- public void visit(TCTLAXNode axNode, Object context) {
736- XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_NEXT));
737- axNode.getProperty().accept(this, context);
738- XMLQuery.append(endTag(XML_NEXT) + endTag(XML_ALLPATHS));
739- }
740-
741- public void visit(TCTLAUNode auNode, Object context) {
742- XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_UNTIL) + startTag(XML_BEFORE));
743- auNode.getLeft().accept(this, context);
744- XMLQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
745- auNode.getRight().accept(this, context);
746- XMLQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_ALLPATHS));
747- }
748-
749- public void visit(TCTLEFNode efNode, Object context) {
750- XMLQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_FINALLY));
751- efNode.getProperty().accept(this, context);
752- XMLQuery.append(endTag(XML_FINALLY) + endTag(XML_EXISTSPATH));
753- }
754-
755- public void visit(TCTLEGNode egNode, Object context) {
756- XMLQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_GLOBALLY));
757- egNode.getProperty().accept(this, context);
758- XMLQuery.append(endTag(XML_GLOBALLY) + endTag(XML_EXISTSPATH));
759- }
760-
761- public void visit(TCTLEXNode exNode, Object context) {
762- XMLQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_NEXT));
763- exNode.getProperty().accept(this, context);
764- XMLQuery.append(endTag(XML_NEXT) + endTag(XML_EXISTSPATH));
765- }
766-
767- public void visit(TCTLEUNode euNode, Object context) {
768- XMLQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_UNTIL) + startTag(XML_BEFORE));
769- euNode.getLeft().accept(this, context);
770- XMLQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
771- euNode.getRight().accept(this, context);
772- XMLQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_EXISTSPATH));
773- }
774+
775+ private static final String XML_NS = "xmlns=\"http://tapaal.net/\"";
776+ private static final String XML_PROPSET = "property-set";
777+ private static final String XML_PROP = "property";
778+ private static final String XML_PROPID = "id";
779+ private static final String XML_PROPDESC = "description";
780+ private static final String XML_FORMULA = "formula";
781+ private static final String XML_ALLPATHS = "all-paths";
782+ private static final String XML_EXISTSPATH = "exists-path";
783+ private static final String XML_NEGATION = "negation";
784+ private static final String XML_CONJUNCTION = "conjunction";
785+ private static final String XML_DISJUNCTION = "disjunction";
786+ private static final String XML_GLOBALLY = "globally";
787+ private static final String XML_FINALLY = "finally";
788+ private static final String XML_NEXT = "next";
789+ private static final String XML_UNTIL = "until";
790+ private static final String XML_BEFORE = "before";
791+ private static final String XML_REACH = "reach";
792+ private static final String XML_DEADLOCK = "deadlock";
793+ private static final String XML_TRUE = "true";
794+ private static final String XML_FALSE = "false";
795+ private static final String XML_INTEGERLT = "integer-lt";
796+ private static final String XML_INTEGERLE = "integer-le";
797+ private static final String XML_INTEGEREQ = "integer-eq";
798+ private static final String XML_INTEGERNE = "integer-ne";
799+ private static final String XML_INTEGERGT = "integer-gt";
800+ private static final String XML_INTEGERGE = "integer-ge";
801+ private static final String XML_ISFIREABLE = "is-fireable";
802+ private static final String XML_INTEGERCONSTANT = "integer-constant";
803+ private static final String XML_TOKENSCOUNT = "tokens-count";
804+ private static final String XML_PLACE = "place";
805+ private static final String XML_TRANSITION = "transition";
806+ private static final String XML_INTEGERSUM = "integer-sum";
807+ private static final String XML_INTEGERPRODUCT = "integer-product";
808+ private static final String XML_INTEGERDIFFERENCE = "integer-difference";
809+ private static final String CONTROL = "control";
810+
811+ private final StringBuffer xmlQuery = new StringBuffer();
812+
813+ public CTLQueryVisitor() {
814+ super();
815+ }
816+
817+ public String getXMLQueryFor(TCTLAbstractProperty property, String queryName, boolean control) {
818+ buildXMLQuery(property, queryName, control);
819+ return getFormatted();
820+ }
821+
822+ public void buildXMLQuery(TCTLAbstractProperty property, String queryName, boolean control) {
823+ xmlQuery.append(startTag(XML_PROP) + queryInfo(queryName) + startTag(XML_FORMULA));
824+ if (control) xmlQuery.append(startTag(CONTROL));
825+ property.accept(this, null);
826+ if (control) xmlQuery.append(endTag(CONTROL));
827+ xmlQuery.append(endTag(XML_FORMULA) + endTag(XML_PROP));
828+ }
829+
830+ public String getFormatted() {
831+ XMLFormatter formatter = new XMLFormatter();
832+ return formatter.format(getStartTag() + xmlQuery.toString() + getEndTag());
833+ }
834+
835+ public StringBuffer getXMLQuery() {
836+ return xmlQuery;
837+ }
838+
839+ public String getStartTag() {
840+ return startTag(XML_PROPSET + " " + XML_NS) + "\n";
841+ }
842+
843+ public String getEndTag() {
844+ return endTag(XML_PROPSET) + "\n";
845+ }
846+
847+ private String queryInfo(String queryName) {
848+ String nameToPrint = (queryName == null) ? "Query Comment/Name Here" : queryName;
849+ return wrapInTag(nameToPrint, XML_PROPID) + wrapInTag(nameToPrint, XML_PROPDESC);
850+ }
851+
852+ public void visit(TCTLAFNode afNode, Object context) {
853+ xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_FINALLY));
854+ afNode.getProperty().accept(this, context);
855+ xmlQuery.append(endTag(XML_FINALLY) + endTag(XML_ALLPATHS));
856+ }
857+
858+ public void visit(TCTLAGNode agNode, Object context) {
859+ xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_GLOBALLY));
860+ agNode.getProperty().accept(this, context);
861+ xmlQuery.append(endTag(XML_GLOBALLY) + endTag(XML_ALLPATHS));
862+ }
863+
864+ public void visit(TCTLAXNode axNode, Object context) {
865+ xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_NEXT));
866+ axNode.getProperty().accept(this, context);
867+ xmlQuery.append(endTag(XML_NEXT) + endTag(XML_ALLPATHS));
868+ }
869+
870+ public void visit(TCTLAUNode auNode, Object context) {
871+ xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_UNTIL) + startTag(XML_BEFORE));
872+ auNode.getLeft().accept(this, context);
873+ xmlQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
874+ auNode.getRight().accept(this, context);
875+ xmlQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_ALLPATHS));
876+ }
877+
878+ public void visit(TCTLEFNode efNode, Object context) {
879+ xmlQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_FINALLY));
880+ efNode.getProperty().accept(this, context);
881+ xmlQuery.append(endTag(XML_FINALLY) + endTag(XML_EXISTSPATH));
882+ }
883+
884+ public void visit(TCTLEGNode egNode, Object context) {
885+ xmlQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_GLOBALLY));
886+ egNode.getProperty().accept(this, context);
887+ xmlQuery.append(endTag(XML_GLOBALLY) + endTag(XML_EXISTSPATH));
888+ }
889+
890+ public void visit(TCTLEXNode exNode, Object context) {
891+ xmlQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_NEXT));
892+ exNode.getProperty().accept(this, context);
893+ xmlQuery.append(endTag(XML_NEXT) + endTag(XML_EXISTSPATH));
894+ }
895+
896+ public void visit(TCTLEUNode euNode, Object context) {
897+ xmlQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_UNTIL) + startTag(XML_BEFORE));
898+ euNode.getLeft().accept(this, context);
899+ xmlQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
900+ euNode.getRight().accept(this, context);
901+ xmlQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_EXISTSPATH));
902+ }
903
904 public void visit(LTLFNode afNode, Object context) {
905- XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_FINALLY));
906+ xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_FINALLY));
907 afNode.getProperty().accept(this, context);
908- XMLQuery.append(endTag(XML_FINALLY) + endTag(XML_ALLPATHS));
909+ xmlQuery.append(endTag(XML_FINALLY) + endTag(XML_ALLPATHS));
910 }
911
912 public void visit(LTLGNode agNode, Object context) {
913- XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_GLOBALLY));
914+ xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_GLOBALLY));
915 agNode.getProperty().accept(this, context);
916- XMLQuery.append(endTag(XML_GLOBALLY) + endTag(XML_ALLPATHS));
917+ xmlQuery.append(endTag(XML_GLOBALLY) + endTag(XML_ALLPATHS));
918 }
919
920 public void visit(LTLXNode axNode, Object context) {
921- XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_NEXT));
922+ xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_NEXT));
923 axNode.getProperty().accept(this, context);
924- XMLQuery.append(endTag(XML_NEXT) + endTag(XML_ALLPATHS));
925+ xmlQuery.append(endTag(XML_NEXT) + endTag(XML_ALLPATHS));
926 }
927
928 public void visit(LTLUNode auNode, Object context) {
929- XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_UNTIL) + startTag(XML_BEFORE));
930+ xmlQuery.append(startTag(XML_ALLPATHS) + startTag(XML_UNTIL) + startTag(XML_BEFORE));
931 auNode.getLeft().accept(this, context);
932- XMLQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
933+ xmlQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
934 auNode.getRight().accept(this, context);
935- XMLQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_ALLPATHS));
936- }
937-
938- public void visit(TCTLPathToStateConverter pathConverter, Object context) {
939- pathConverter.getProperty().accept(this, context);
940- }
941-
942- public void visit(TCTLAndListNode andListNode, Object context) {
943- createList(andListNode.getProperties(), context, XML_CONJUNCTION);
944- }
945-
946- public void visit(TCTLOrListNode orListNode, Object context) {
947- createList(orListNode.getProperties(), context, XML_DISJUNCTION);
948- }
949-
950- public void visit(TCTLTermListNode termListNode, Object context) {
951- assert termListNode.getProperties().get(1) instanceof AritmeticOperator;
952- AritmeticOperator operator = (AritmeticOperator)termListNode.getProperties().get(1);
953- String op = operator.toString();
954- if (op.equals("+")) {
955- createList(termListNode.getProperties(), context, XML_INTEGERSUM);
956- } else if (op.equals("*")) {
957- createList(termListNode.getProperties(), context, XML_INTEGERPRODUCT);
958- } else if (op.equals("-")) {
959- createList(termListNode.getProperties(), context, XML_INTEGERDIFFERENCE);
960- }
961- }
962-
963- private void createList(List<TCTLAbstractStateProperty> properties, Object context, String seperator) {
964- XMLQuery.append(startTag(seperator));
965-
966- for (TCTLAbstractStateProperty p : properties) {
967- p.accept(this, context);
968- }
969-
970- XMLQuery.append(endTag(seperator));
971- }
972-
973- public void visit(TCTLNotNode notNode, Object context) {
974- XMLQuery.append(startTag(XML_NEGATION));
975- notNode.getProperty().accept(this, context);
976- XMLQuery.append(endTag(XML_NEGATION));
977- }
978-
979- public void visit(TCTLTrueNode tctlTrueNode, Object context) {
980- XMLQuery.append(emptyElement(XML_TRUE));
981- }
982-
983- public void visit(TCTLFalseNode tctlFalseNode, Object context) {
984- XMLQuery.append(emptyElement(XML_FALSE));
985- }
986-
987- public void visit(TCTLDeadlockNode tctlDeadLockNode, Object context) {
988- XMLQuery.append(emptyElement(XML_DEADLOCK));
989- }
990-
991- public void visit(TCTLConstNode tctlConstNode, Object context){
992- XMLQuery.append(wrapInTag(String.valueOf(tctlConstNode.getConstant()) + "", XML_INTEGERCONSTANT));
993- }
994-
995- public void visit(TCTLPlaceNode tctlPlaceNode, Object context){
996- XMLQuery.append(startTag(XML_TOKENSCOUNT));
997- XMLQuery.append(wrapInTag(tctlPlaceNode.toString() + "", XML_PLACE));
998- XMLQuery.append(endTag(XML_TOKENSCOUNT));
999- }
1000-
1001- public void visit(TCTLTransitionNode tctlTransitionNode, Object context){
1002- XMLQuery.append(startTag(XML_ISFIREABLE));
1003- XMLQuery.append(wrapInTag(tctlTransitionNode.toString() + "", XML_TRANSITION));
1004- XMLQuery.append(endTag(XML_ISFIREABLE));
1005- }
1006-
1007- @Override
1008- public void visit(TCTLAtomicPropositionNode atomicPropositionNode,
1009- Object context) {
1010- String opTest = atomicPropositionNode.getOp();
1011- String op = new String();
1012-
1013- if (opTest.equals("<")){
1014- op = XML_INTEGERLT;
1015- } else if(opTest.equals("<=")){
1016- op = XML_INTEGERLE;
1017- } else if(opTest.equals("=")){
1018- op = XML_INTEGEREQ;
1019- } else if(opTest.equals("!=")){
1020- op = XML_INTEGERNE;
1021- } else if(opTest.equals(">")){
1022- op = XML_INTEGERGT;
1023- } else if(opTest.equals(">=")){
1024- op = XML_INTEGERGE;
1025- } else {
1026- op = "MISSING_OPERATOR";
1027- }
1028-
1029- XMLQuery.append(startTag(op));
1030- atomicPropositionNode.getLeft().accept(this, context);
1031- atomicPropositionNode.getRight().accept(this, context);
1032- XMLQuery.append(endTag(op));
1033- }
1034-
1035- private String wrapInTag(String str, String tag){
1036- return startTag(tag) + str + endTag(tag);
1037- }
1038- private String startTag(String tag){
1039- return "<" + tag + ">";
1040- }
1041- private String endTag(String tag){
1042- return "</" + tag + ">";
1043- }
1044- private String emptyElement(String tag){
1045- return startTag(tag + "/");
1046- }
1047+ xmlQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_ALLPATHS));
1048+ }
1049+
1050+ public void visit(TCTLPathToStateConverter pathConverter, Object context) {
1051+ pathConverter.getProperty().accept(this, context);
1052+ }
1053+
1054+ public void visit(TCTLAndListNode andListNode, Object context) {
1055+ createList(andListNode.getProperties(), context, XML_CONJUNCTION);
1056+ }
1057+
1058+ public void visit(TCTLOrListNode orListNode, Object context) {
1059+ createList(orListNode.getProperties(), context, XML_DISJUNCTION);
1060+ }
1061+
1062+ public void visit(TCTLTermListNode termListNode, Object context) {
1063+ assert termListNode.getProperties().get(1) instanceof AritmeticOperator;
1064+ AritmeticOperator operator = (AritmeticOperator) termListNode.getProperties().get(1);
1065+ String op = operator.toString();
1066+ switch (op) {
1067+ case "+":
1068+ createList(termListNode.getProperties(), context, XML_INTEGERSUM);
1069+ break;
1070+ case "*":
1071+ createList(termListNode.getProperties(), context, XML_INTEGERPRODUCT);
1072+ break;
1073+ case "-":
1074+ createList(termListNode.getProperties(), context, XML_INTEGERDIFFERENCE);
1075+ break;
1076+ }
1077+ }
1078+
1079+ private void createList(List<TCTLAbstractStateProperty> properties, Object context, String seperator) {
1080+ xmlQuery.append(startTag(seperator));
1081+
1082+ for (TCTLAbstractStateProperty p : properties) {
1083+ p.accept(this, context);
1084+ }
1085+
1086+ xmlQuery.append(endTag(seperator));
1087+ }
1088+
1089+ public void visit(TCTLNotNode notNode, Object context) {
1090+ xmlQuery.append(startTag(XML_NEGATION));
1091+ notNode.getProperty().accept(this, context);
1092+ xmlQuery.append(endTag(XML_NEGATION));
1093+ }
1094+
1095+ public void visit(TCTLTrueNode tctlTrueNode, Object context) {
1096+ xmlQuery.append(emptyElement(XML_TRUE));
1097+ }
1098+
1099+ public void visit(TCTLFalseNode tctlFalseNode, Object context) {
1100+ xmlQuery.append(emptyElement(XML_FALSE));
1101+ }
1102+
1103+ public void visit(TCTLDeadlockNode tctlDeadLockNode, Object context) {
1104+ xmlQuery.append(emptyElement(XML_DEADLOCK));
1105+ }
1106+
1107+ public void visit(TCTLConstNode tctlConstNode, Object context) {
1108+ xmlQuery.append(wrapInTag(tctlConstNode.getConstant() + "", XML_INTEGERCONSTANT));
1109+ }
1110+
1111+ public void visit(TCTLPlaceNode tctlPlaceNode, Object context) {
1112+ xmlQuery.append(startTag(XML_TOKENSCOUNT));
1113+ xmlQuery.append(wrapInTag(tctlPlaceNode.toString() + "", XML_PLACE));
1114+ xmlQuery.append(endTag(XML_TOKENSCOUNT));
1115+ }
1116+
1117+ public void visit(TCTLTransitionNode tctlTransitionNode, Object context) {
1118+ xmlQuery.append(startTag(XML_ISFIREABLE));
1119+ xmlQuery.append(wrapInTag(tctlTransitionNode.toString() + "", XML_TRANSITION));
1120+ xmlQuery.append(endTag(XML_ISFIREABLE));
1121+ }
1122+
1123+ @Override
1124+ public void visit(TCTLAtomicPropositionNode atomicPropositionNode, Object context) {
1125+ String opTest = atomicPropositionNode.getOp();
1126+ String op;
1127+
1128+ switch (opTest) {
1129+ case "<":
1130+ op = XML_INTEGERLT;
1131+ break;
1132+ case "<=":
1133+ op = XML_INTEGERLE;
1134+ break;
1135+ case "=":
1136+ op = XML_INTEGEREQ;
1137+ break;
1138+ case "!=":
1139+ op = XML_INTEGERNE;
1140+ break;
1141+ case ">":
1142+ op = XML_INTEGERGT;
1143+ break;
1144+ case ">=":
1145+ op = XML_INTEGERGE;
1146+ break;
1147+ default:
1148+ op = "MISSING_OPERATOR";
1149+ break;
1150+ }
1151+
1152+ xmlQuery.append(startTag(op));
1153+ atomicPropositionNode.getLeft().accept(this, context);
1154+ atomicPropositionNode.getRight().accept(this, context);
1155+ xmlQuery.append(endTag(op));
1156+ }
1157+
1158+ private String wrapInTag(String str, String tag) {
1159+ return startTag(tag) + str + endTag(tag);
1160+ }
1161+
1162+ private String startTag(String tag) {
1163+ return "<" + tag + ">";
1164+ }
1165+
1166+ private String endTag(String tag) {
1167+ return "</" + tag + ">";
1168+ }
1169+
1170+ private String emptyElement(String tag) {
1171+ return startTag(tag + "/");
1172+ }
1173 }
1174
1175=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/CombiTranslationQueryVisitor.java'
1176--- src/dk/aau/cs/TCTL/visitors/CombiTranslationQueryVisitor.java 2019-03-22 10:13:18 +0000
1177+++ src/main/java/dk/aau/cs/TCTL/visitors/CombiTranslationQueryVisitor.java 2022-07-21 13:30:11 +0000
1178@@ -11,13 +11,13 @@
1179 protected static final String PLOCK = "P_lock";
1180 protected static final String TOKEN_TEMPLATE_NAME = "Token";
1181
1182- private boolean useSymmetry;
1183- private int totalTokens;
1184- private TimedArcPetriNet model;
1185- private Hashtable<String, Boolean> placeNameToTimed;
1186- private int maxDegDif;
1187- private int initTransitions;
1188- private int maxTimeIn;
1189+ private final boolean useSymmetry;
1190+ private final int totalTokens;
1191+ private final TimedArcPetriNet model;
1192+ private final Hashtable<String, Boolean> placeNameToTimed;
1193+ private final int maxDegDif;
1194+ private final int initTransitions;
1195+ private final int maxTimeIn;
1196
1197 public CombiTranslationQueryVisitor(boolean useSymmetry, int totalTokens, TimedArcPetriNet model, Hashtable<String, Boolean> placeNameToTimed, int maxDegDif, int initTransitions, int maxTimeIn) {
1198 this.useSymmetry = useSymmetry;
1199
1200=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/ContainsPlaceWithDisabledTemplateVisitor.java'
1201--- src/dk/aau/cs/TCTL/visitors/ContainsPlaceWithDisabledTemplateVisitor.java 2014-05-22 20:26:41 +0000
1202+++ src/main/java/dk/aau/cs/TCTL/visitors/ContainsPlaceWithDisabledTemplateVisitor.java 2022-07-21 13:30:11 +0000
1203@@ -6,7 +6,7 @@
1204
1205 public class ContainsPlaceWithDisabledTemplateVisitor extends VisitorBase implements ITCTLVisitor {
1206
1207- private TimedArcPetriNetNetwork network;
1208+ private final TimedArcPetriNetNetwork network;
1209
1210 public ContainsPlaceWithDisabledTemplateVisitor(TimedArcPetriNetNetwork network){
1211 this.network = network;
1212@@ -14,15 +14,18 @@
1213
1214 @Override
1215 public void visit(TCTLPlaceNode placeNode, Object context) {
1216- if(placeNode.getTemplate().equals("") && network.getSharedPlaceByName(placeNode.getPlace()) != null)
1217- return;
1218+ if(placeNode.getTemplate().equals("") && network.getSharedPlaceByName(placeNode.getPlace()) != null) {
1219+ return;
1220+ }
1221
1222 for(TimedArcPetriNet net : network.activeTemplates()) {
1223- if(placeNode.getTemplate().equals(net.name()) && net.getPlaceByName(placeNode.getPlace()) != null)
1224- return;
1225+ if(placeNode.getTemplate().equals(net.name()) && net.getPlaceByName(placeNode.getPlace()) != null) {
1226+ return;
1227+ }
1228 }
1229
1230- if(context instanceof BooleanResult)
1231- ((BooleanResult)context).setResult(false);
1232+ if(context instanceof BooleanResult) {
1233+ ((BooleanResult)context).setResult(false);
1234+ }
1235 }
1236 }
1237
1238=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/ContainsSharedPlaceVisitor.java'
1239--- src/dk/aau/cs/TCTL/visitors/ContainsSharedPlaceVisitor.java 2014-05-22 20:26:41 +0000
1240+++ src/main/java/dk/aau/cs/TCTL/visitors/ContainsSharedPlaceVisitor.java 2022-07-21 13:30:11 +0000
1241@@ -3,7 +3,7 @@
1242 import dk.aau.cs.TCTL.TCTLPlaceNode;
1243
1244 public class ContainsSharedPlaceVisitor extends VisitorBase implements ITCTLVisitor {
1245- private String sharedPlaceName;
1246+ private final String sharedPlaceName;
1247
1248 public ContainsSharedPlaceVisitor(String sharedPlaceName){
1249 this.sharedPlaceName = sharedPlaceName;
1250@@ -11,8 +11,9 @@
1251
1252 @Override
1253 public void visit(TCTLPlaceNode placeNode, Object context) {
1254- if(placeNode.getTemplate().equals("") && placeNode.getPlace().equals(sharedPlaceName))
1255- ((BooleanResult)context).setResult(true);
1256+ if(placeNode.getTemplate().equals("") && placeNode.getPlace().equals(sharedPlaceName)) {
1257+ ((BooleanResult)context).setResult(true);
1258+ }
1259 }
1260
1261 }
1262
1263=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/ContainsSharedTransitionVisitor.java'
1264--- src/dk/aau/cs/TCTL/visitors/ContainsSharedTransitionVisitor.java 2017-03-12 00:33:00 +0000
1265+++ src/main/java/dk/aau/cs/TCTL/visitors/ContainsSharedTransitionVisitor.java 2022-07-21 13:30:11 +0000
1266@@ -3,7 +3,7 @@
1267 import dk.aau.cs.TCTL.TCTLTransitionNode;
1268
1269 public class ContainsSharedTransitionVisitor extends VisitorBase implements ITCTLVisitor {
1270- private String sharedTransitionName;
1271+ private final String sharedTransitionName;
1272
1273 public ContainsSharedTransitionVisitor(String sharedTransitionName){
1274 this.sharedTransitionName = sharedTransitionName;
1275
1276=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/FixAbbrivPlaceNames.java'
1277--- src/dk/aau/cs/TCTL/visitors/FixAbbrivPlaceNames.java 2014-11-01 09:31:54 +0000
1278+++ src/main/java/dk/aau/cs/TCTL/visitors/FixAbbrivPlaceNames.java 2022-07-21 13:30:11 +0000
1279@@ -1,8 +1,3 @@
1280-/*
1281- * To change this license header, choose License Headers in Project Properties.
1282- * To change this template file, choose Tools | Templates
1283- * and open the template in the editor.
1284- */
1285 package dk.aau.cs.TCTL.visitors;
1286
1287 import dk.aau.cs.TCTL.TCTLAbstractProperty;
1288@@ -10,13 +5,9 @@
1289 import dk.aau.cs.util.Tuple;
1290 import java.util.ArrayList;
1291
1292-/**
1293- *
1294- * @author jakob
1295- */
1296 public class FixAbbrivPlaceNames extends VisitorBase {
1297
1298- private ArrayList<Tuple<String, String>> templatePlaceNames;
1299+ private final ArrayList<Tuple<String, String>> templatePlaceNames;
1300
1301 public FixAbbrivPlaceNames(ArrayList<Tuple<String, String>> templatePlaceNames) {
1302 this.templatePlaceNames = templatePlaceNames;
1303
1304=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/FixAbbrivTransitionNames.java'
1305--- src/dk/aau/cs/TCTL/visitors/FixAbbrivTransitionNames.java 2017-03-12 00:33:00 +0000
1306+++ src/main/java/dk/aau/cs/TCTL/visitors/FixAbbrivTransitionNames.java 2022-07-21 13:30:11 +0000
1307@@ -12,7 +12,7 @@
1308
1309 public class FixAbbrivTransitionNames extends VisitorBase {
1310
1311- private ArrayList<Tuple<String, String>> templateTransitionNames;
1312+ private final ArrayList<Tuple<String, String>> templateTransitionNames;
1313
1314 public FixAbbrivTransitionNames(ArrayList<Tuple<String, String>> templateTransitionNames) {
1315 this.templateTransitionNames = templateTransitionNames;
1316
1317=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/HasDeadlockVisitor.java'
1318--- src/dk/aau/cs/TCTL/visitors/HasDeadlockVisitor.java 2013-05-18 21:26:56 +0000
1319+++ src/main/java/dk/aau/cs/TCTL/visitors/HasDeadlockVisitor.java 2022-07-21 13:30:11 +0000
1320@@ -16,7 +16,7 @@
1321 ((Context)context).hasDeadlock = true;
1322 }
1323
1324- private class Context{
1325+ private static class Context{
1326 public boolean hasDeadlock = true;
1327 }
1328 }
1329
1330=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/IsReachabilityVisitor.java'
1331--- src/dk/aau/cs/TCTL/visitors/IsReachabilityVisitor.java 2017-08-03 11:48:35 +0000
1332+++ src/main/java/dk/aau/cs/TCTL/visitors/IsReachabilityVisitor.java 2022-07-21 13:30:11 +0000
1333@@ -4,7 +4,7 @@
1334
1335 public class IsReachabilityVisitor extends VisitorBase {
1336
1337- private class Context{
1338+ private static class Context{
1339 public boolean isReachability = true;
1340 public int nTempOp = 0; // number of temporal operators
1341 }
1342
1343=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/LTLQueryVisitor.java'
1344--- src/dk/aau/cs/TCTL/visitors/LTLQueryVisitor.java 2021-10-14 06:28:05 +0000
1345+++ src/main/java/dk/aau/cs/TCTL/visitors/LTLQueryVisitor.java 2022-07-21 13:30:11 +0000
1346@@ -7,45 +7,45 @@
1347
1348 public class LTLQueryVisitor extends VisitorBase {
1349
1350- private static final String XML_NS = "xmlns=\"http://tapaal.net/\"";
1351- private static final String XML_PROPSET = "property-set";
1352- private static final String XML_PROP = "property";
1353- private static final String XML_PROPID = "id";
1354- private static final String XML_PROPDESC = "description";
1355- private static final String XML_FORMULA = "formula";
1356- private static final String XML_ALLPATHS = "all-paths";
1357- private static final String XML_EXISTSPATH = "exists-path";
1358- private static final String XML_NEGATION = "negation";
1359+ private static final String XML_NS = "xmlns=\"http://tapaal.net/\"";
1360+ private static final String XML_PROPSET = "property-set";
1361+ private static final String XML_PROP = "property";
1362+ private static final String XML_PROPID = "id";
1363+ private static final String XML_PROPDESC = "description";
1364+ private static final String XML_FORMULA = "formula";
1365+ private static final String XML_ALLPATHS = "all-paths";
1366+ private static final String XML_EXISTSPATH = "exists-path";
1367+ private static final String XML_NEGATION = "negation";
1368 private static final String XML_CONJUNCTION = "conjunction";
1369 private static final String XML_DISJUNCTION = "disjunction";
1370- private static final String XML_GLOBALLY = "globally";
1371- private static final String XML_FINALLY = "finally";
1372- private static final String XML_NEXT = "next";
1373- private static final String XML_UNTIL = "until";
1374- private static final String XML_BEFORE = "before";
1375- private static final String XML_REACH = "reach";
1376- private static final String XML_DEADLOCK = "deadlock";
1377- private static final String XML_TRUE = "true";
1378- private static final String XML_FALSE = "false";
1379- private static final String XML_INTEGERLT = "integer-lt";
1380- private static final String XML_INTEGERLE = "integer-le";
1381- private static final String XML_INTEGEREQ = "integer-eq";
1382- private static final String XML_INTEGERNE = "integer-ne";
1383- private static final String XML_INTEGERGT = "integer-gt";
1384- private static final String XML_INTEGERGE = "integer-ge";
1385- private static final String XML_ISFIREABLE = "is-fireable";
1386+ private static final String XML_GLOBALLY = "globally";
1387+ private static final String XML_FINALLY = "finally";
1388+ private static final String XML_NEXT = "next";
1389+ private static final String XML_UNTIL = "until";
1390+ private static final String XML_BEFORE = "before";
1391+ private static final String XML_REACH = "reach";
1392+ private static final String XML_DEADLOCK = "deadlock";
1393+ private static final String XML_TRUE = "true";
1394+ private static final String XML_FALSE = "false";
1395+ private static final String XML_INTEGERLT = "integer-lt";
1396+ private static final String XML_INTEGERLE = "integer-le";
1397+ private static final String XML_INTEGEREQ = "integer-eq";
1398+ private static final String XML_INTEGERNE = "integer-ne";
1399+ private static final String XML_INTEGERGT = "integer-gt";
1400+ private static final String XML_INTEGERGE = "integer-ge";
1401+ private static final String XML_ISFIREABLE = "is-fireable";
1402 private static final String XML_INTEGERCONSTANT = "integer-constant";
1403 private static final String XML_TOKENSCOUNT = "tokens-count";
1404- private static final String XML_PLACE = "place";
1405- private static final String XML_TRANSITION = "transition";
1406- private static final String XML_INTEGERSUM = "integer-sum";
1407- private static final String XML_INTEGERPRODUCT = "integer-product";
1408- private static final String XML_INTEGERDIFFERENCE = "integer-difference";
1409+ private static final String XML_PLACE = "place";
1410+ private static final String XML_TRANSITION = "transition";
1411+ private static final String XML_INTEGERSUM = "integer-sum";
1412+ private static final String XML_INTEGERPRODUCT = "integer-product";
1413+ private static final String XML_INTEGERDIFFERENCE = "integer-difference";
1414
1415- private StringBuffer XMLQuery;
1416+ private final StringBuffer xmlQuery = new StringBuffer();
1417
1418 public LTLQueryVisitor() {
1419- this.XMLQuery = new StringBuffer();
1420+ super();
1421 }
1422
1423 public String getXMLQueryFor(TCTLAbstractProperty property, String queryName) {
1424@@ -54,20 +54,20 @@
1425 }
1426
1427 public void buildXMLQuery(TCTLAbstractProperty property, String queryName) {
1428- XMLQuery.append(startTag(XML_PROP) + queryInfo(queryName) + startTag(XML_FORMULA));
1429+ xmlQuery.append(startTag(XML_PROP) + queryInfo(queryName) + startTag(XML_FORMULA));
1430 property.accept(this, null);
1431- XMLQuery.append(endTag(XML_FORMULA) + endTag(XML_PROP));
1432+ xmlQuery.append(endTag(XML_FORMULA) + endTag(XML_PROP));
1433 }
1434
1435 public String getFormatted() {
1436 XMLFormatter formatter = new XMLFormatter();
1437- return formatter.format(getStartTag() + XMLQuery.toString() + getEndTag());
1438+ return formatter.format(getStartTag() + xmlQuery.toString() + getEndTag());
1439 }
1440
1441 public String getFormatted(StringBuffer CTLQueries) {
1442 XMLFormatter formatter = new XMLFormatter();
1443- XMLQuery.append(CTLQueries);
1444- return formatter.format(getStartTag() + XMLQuery.toString() + getEndTag());
1445+ xmlQuery.append(CTLQueries);
1446+ return formatter.format(getStartTag() + xmlQuery.toString() + getEndTag());
1447 }
1448
1449 public String getStartTag(){
1450@@ -84,41 +84,41 @@
1451 }
1452
1453 public void visit(LTLANode aNode, Object context) {
1454- XMLQuery.append(startTag(XML_ALLPATHS));
1455+ xmlQuery.append(startTag(XML_ALLPATHS));
1456 aNode.getProperty().accept(this, context);
1457- XMLQuery.append(endTag(XML_ALLPATHS));
1458+ xmlQuery.append(endTag(XML_ALLPATHS));
1459 }
1460
1461 public void visit(LTLENode eNode, Object context) {
1462- XMLQuery.append(startTag(XML_EXISTSPATH));
1463+ xmlQuery.append(startTag(XML_EXISTSPATH));
1464 eNode.getProperty().accept(this, context);
1465- XMLQuery.append(endTag(XML_EXISTSPATH));
1466+ xmlQuery.append(endTag(XML_EXISTSPATH));
1467 }
1468
1469 public void visit(LTLFNode afNode, Object context) {
1470- XMLQuery.append(startTag(XML_FINALLY));
1471+ xmlQuery.append(startTag(XML_FINALLY));
1472 afNode.getProperty().accept(this, context);
1473- XMLQuery.append(endTag(XML_FINALLY));
1474+ xmlQuery.append(endTag(XML_FINALLY));
1475 }
1476
1477 public void visit(LTLGNode agNode, Object context) {
1478- XMLQuery.append(startTag(XML_GLOBALLY));
1479+ xmlQuery.append(startTag(XML_GLOBALLY));
1480 agNode.getProperty().accept(this, context);
1481- XMLQuery.append(endTag(XML_GLOBALLY));
1482+ xmlQuery.append(endTag(XML_GLOBALLY));
1483 }
1484
1485 public void visit(LTLXNode axNode, Object context) {
1486- XMLQuery.append(startTag(XML_NEXT));
1487+ xmlQuery.append(startTag(XML_NEXT));
1488 axNode.getProperty().accept(this, context);
1489- XMLQuery.append(endTag(XML_NEXT));
1490+ xmlQuery.append(endTag(XML_NEXT));
1491 }
1492
1493 public void visit(LTLUNode auNode, Object context) {
1494- XMLQuery.append(startTag(XML_UNTIL) + startTag(XML_BEFORE));
1495+ xmlQuery.append(startTag(XML_UNTIL) + startTag(XML_BEFORE));
1496 auNode.getLeft().accept(this, context);
1497- XMLQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
1498+ xmlQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
1499 auNode.getRight().accept(this, context);
1500- XMLQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL));
1501+ xmlQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL));
1502 }
1503
1504 public void visit(TCTLPathToStateConverter pathConverter, Object context) {
1505@@ -137,85 +137,96 @@
1506 assert termListNode.getProperties().get(1) instanceof AritmeticOperator;
1507 AritmeticOperator operator = (AritmeticOperator)termListNode.getProperties().get(1);
1508 String op = operator.toString();
1509- if (op.equals("+")) {
1510- createList(termListNode.getProperties(), context, XML_INTEGERSUM);
1511- } else if (op.equals("*")) {
1512- createList(termListNode.getProperties(), context, XML_INTEGERPRODUCT);
1513- } else if (op.equals("-")) {
1514- createList(termListNode.getProperties(), context, XML_INTEGERDIFFERENCE);
1515+ switch (op) {
1516+ case "+":
1517+ createList(termListNode.getProperties(), context, XML_INTEGERSUM);
1518+ break;
1519+ case "*":
1520+ createList(termListNode.getProperties(), context, XML_INTEGERPRODUCT);
1521+ break;
1522+ case "-":
1523+ createList(termListNode.getProperties(), context, XML_INTEGERDIFFERENCE);
1524+ break;
1525 }
1526 }
1527
1528 private void createList(List<TCTLAbstractStateProperty> properties, Object context, String seperator) {
1529- XMLQuery.append(startTag(seperator));
1530+ xmlQuery.append(startTag(seperator));
1531
1532 for (TCTLAbstractStateProperty p : properties) {
1533 p.accept(this, context);
1534 }
1535
1536- XMLQuery.append(endTag(seperator));
1537+ xmlQuery.append(endTag(seperator));
1538 }
1539
1540 public void visit(TCTLNotNode notNode, Object context) {
1541- XMLQuery.append(startTag(XML_NEGATION));
1542+ xmlQuery.append(startTag(XML_NEGATION));
1543 notNode.getProperty().accept(this, context);
1544- XMLQuery.append(endTag(XML_NEGATION));
1545+ xmlQuery.append(endTag(XML_NEGATION));
1546 }
1547
1548 public void visit(TCTLTrueNode tctlTrueNode, Object context) {
1549- XMLQuery.append(emptyElement(XML_TRUE));
1550+ xmlQuery.append(emptyElement(XML_TRUE));
1551 }
1552
1553 public void visit(TCTLFalseNode tctlFalseNode, Object context) {
1554- XMLQuery.append(emptyElement(XML_FALSE));
1555+ xmlQuery.append(emptyElement(XML_FALSE));
1556 }
1557
1558 public void visit(TCTLDeadlockNode tctlDeadLockNode, Object context) {
1559- XMLQuery.append(emptyElement(XML_DEADLOCK));
1560+ xmlQuery.append(emptyElement(XML_DEADLOCK));
1561 }
1562
1563 public void visit(TCTLConstNode tctlConstNode, Object context){
1564- XMLQuery.append(wrapInTag(String.valueOf(tctlConstNode.getConstant()) + "", XML_INTEGERCONSTANT));
1565+ xmlQuery.append(wrapInTag(tctlConstNode.getConstant() + "", XML_INTEGERCONSTANT));
1566 }
1567
1568 public void visit(TCTLPlaceNode tctlPlaceNode, Object context){
1569- XMLQuery.append(startTag(XML_TOKENSCOUNT));
1570- XMLQuery.append(wrapInTag(tctlPlaceNode.toString() + "", XML_PLACE));
1571- XMLQuery.append(endTag(XML_TOKENSCOUNT));
1572+ xmlQuery.append(startTag(XML_TOKENSCOUNT));
1573+ xmlQuery.append(wrapInTag(tctlPlaceNode.toString() + "", XML_PLACE));
1574+ xmlQuery.append(endTag(XML_TOKENSCOUNT));
1575 }
1576
1577 public void visit(TCTLTransitionNode tctlTransitionNode, Object context){
1578- XMLQuery.append(startTag(XML_ISFIREABLE));
1579- XMLQuery.append(wrapInTag(tctlTransitionNode.toString() + "", XML_TRANSITION));
1580- XMLQuery.append(endTag(XML_ISFIREABLE));
1581+ xmlQuery.append(startTag(XML_ISFIREABLE));
1582+ xmlQuery.append(wrapInTag(tctlTransitionNode.toString() + "", XML_TRANSITION));
1583+ xmlQuery.append(endTag(XML_ISFIREABLE));
1584 }
1585
1586 @Override
1587- public void visit(TCTLAtomicPropositionNode atomicPropositionNode,
1588- Object context) {
1589+ public void visit(TCTLAtomicPropositionNode atomicPropositionNode, Object context) {
1590 String opTest = atomicPropositionNode.getOp();
1591- String op = new String();
1592+ String op;
1593
1594- if (opTest.equals("<")){
1595- op = XML_INTEGERLT;
1596- } else if(opTest.equals("<=")){
1597- op = XML_INTEGERLE;
1598- } else if(opTest.equals("=")){
1599- op = XML_INTEGEREQ;
1600- } else if(opTest.equals("!=")){
1601- op = XML_INTEGERNE;
1602- } else if(opTest.equals(">")){
1603- op = XML_INTEGERGT;
1604- } else if(opTest.equals(">=")){
1605- op = XML_INTEGERGE;
1606- } else {
1607- op = "MISSING_OPERATOR";
1608+ switch (opTest) {
1609+ case "<":
1610+ op = XML_INTEGERLT;
1611+ break;
1612+ case "<=":
1613+ op = XML_INTEGERLE;
1614+ break;
1615+ case "=":
1616+ op = XML_INTEGEREQ;
1617+ break;
1618+ case "!=":
1619+ op = XML_INTEGERNE;
1620+ break;
1621+ case ">":
1622+ op = XML_INTEGERGT;
1623+ break;
1624+ case ">=":
1625+ op = XML_INTEGERGE;
1626+ break;
1627+ default:
1628+ op = "MISSING_OPERATOR";
1629+ break;
1630 }
1631
1632- XMLQuery.append(startTag(op));
1633+ xmlQuery.append(startTag(op));
1634 atomicPropositionNode.getLeft().accept(this, context);
1635 atomicPropositionNode.getRight().accept(this, context);
1636- XMLQuery.append(endTag(op));
1637+ xmlQuery.append(endTag(op));
1638 }
1639
1640 private String wrapInTag(String str, String tag){
1641
1642=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/OptimizedStandardTranslationQueryVisitor.java'
1643--- src/dk/aau/cs/TCTL/visitors/OptimizedStandardTranslationQueryVisitor.java 2019-03-23 07:51:29 +0000
1644+++ src/main/java/dk/aau/cs/TCTL/visitors/OptimizedStandardTranslationQueryVisitor.java 2022-07-21 13:30:11 +0000
1645@@ -11,8 +11,8 @@
1646 protected static final String LOCK_BOOL = "lock";
1647
1648 protected static final String TOKEN_TEMPLATE_NAME = "Token";
1649- private boolean useSymmetry;
1650- private int totalTokens;
1651+ private final boolean useSymmetry;
1652+ private final int totalTokens;
1653
1654 public OptimizedStandardTranslationQueryVisitor(int totalTokens, boolean useSymmetry) {
1655 this.useSymmetry = useSymmetry;
1656
1657=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/RenamePlaceTCTLVisitor.java'
1658--- src/dk/aau/cs/TCTL/visitors/RenamePlaceTCTLVisitor.java 2014-05-22 20:26:41 +0000
1659+++ src/main/java/dk/aau/cs/TCTL/visitors/RenamePlaceTCTLVisitor.java 2022-07-21 13:30:11 +0000
1660@@ -4,8 +4,8 @@
1661
1662 public class RenamePlaceTCTLVisitor extends VisitorBase{
1663
1664- private String oldPlaceName;
1665- private String newPlaceName;
1666+ private final String oldPlaceName;
1667+ private final String newPlaceName;
1668
1669 public RenamePlaceTCTLVisitor(String oldName, String newName) {
1670 oldPlaceName = oldName;
1671
1672=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/RenameTransitionTCTLVisitor.java'
1673--- src/dk/aau/cs/TCTL/visitors/RenameTransitionTCTLVisitor.java 2017-03-12 00:33:00 +0000
1674+++ src/main/java/dk/aau/cs/TCTL/visitors/RenameTransitionTCTLVisitor.java 2022-07-21 13:30:11 +0000
1675@@ -4,8 +4,8 @@
1676
1677 public class RenameTransitionTCTLVisitor extends VisitorBase{
1678
1679- private String oldTransitionName;
1680- private String newTransitionName;
1681+ private final String oldTransitionName;
1682+ private final String newTransitionName;
1683
1684 public RenameTransitionTCTLVisitor(String oldName, String newName) {
1685 oldTransitionName = oldName;
1686
1687=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/StandardTranslationQueryVisitor.java'
1688--- src/dk/aau/cs/TCTL/visitors/StandardTranslationQueryVisitor.java 2019-03-23 07:51:29 +0000
1689+++ src/main/java/dk/aau/cs/TCTL/visitors/StandardTranslationQueryVisitor.java 2022-07-21 13:30:11 +0000
1690@@ -12,7 +12,7 @@
1691
1692 protected static final String TOKEN_TEMPLATE_NAME = "Token";
1693
1694- private int totalTokens;
1695+ private final int totalTokens;
1696
1697 public StandardTranslationQueryVisitor(int totalTokens) {
1698 this.totalTokens = totalTokens;
1699
1700=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/VerifyPlaceNamesVisitor.java'
1701--- src/dk/aau/cs/TCTL/visitors/VerifyPlaceNamesVisitor.java 2017-03-12 00:33:00 +0000
1702+++ src/main/java/dk/aau/cs/TCTL/visitors/VerifyPlaceNamesVisitor.java 2022-07-21 13:30:11 +0000
1703@@ -9,7 +9,7 @@
1704
1705 public class VerifyPlaceNamesVisitor extends VisitorBase {
1706
1707- private ArrayList<Tuple<String, String>> templatePlaceNames;
1708+ private final ArrayList<Tuple<String, String>> templatePlaceNames;
1709
1710 public VerifyPlaceNamesVisitor(ArrayList<Tuple<String, String>> templatePlaceNames) {
1711 this.templatePlaceNames = templatePlaceNames;
1712@@ -31,11 +31,10 @@
1713 c.setResult(false);
1714 }
1715 }
1716-
1717- // / context class
1718- public class Context {
1719+
1720+ public static class Context {
1721 private Boolean result;
1722- private HashSet<String> incorrectPlaceNames;
1723+ private final HashSet<String> incorrectPlaceNames;
1724
1725 public Boolean getResult() {
1726 return result;
1727
1728=== modified file 'src/main/java/dk/aau/cs/TCTL/visitors/VerifyTransitionNamesVisitor.java'
1729--- src/dk/aau/cs/TCTL/visitors/VerifyTransitionNamesVisitor.java 2017-03-12 00:33:00 +0000
1730+++ src/main/java/dk/aau/cs/TCTL/visitors/VerifyTransitionNamesVisitor.java 2022-07-21 13:30:11 +0000
1731@@ -8,7 +8,7 @@
1732 import dk.aau.cs.util.Tuple;
1733
1734 public class VerifyTransitionNamesVisitor extends VisitorBase {
1735- private ArrayList<Tuple<String, String>> templateTransitionNames;
1736+ private final ArrayList<Tuple<String, String>> templateTransitionNames;
1737
1738 public VerifyTransitionNamesVisitor(ArrayList<Tuple<String, String>> templateTransitionNames) {
1739 this.templateTransitionNames = templateTransitionNames;
1740@@ -30,11 +30,10 @@
1741 c.setResult(false);
1742 }
1743 }
1744-
1745- // / context class
1746- public class Context {
1747+
1748+ public static class Context {
1749 private Boolean result;
1750- private HashSet<String> incorrectTransitionNames;
1751+ private final HashSet<String> incorrectTransitionNames;
1752
1753 public Boolean getResult() {
1754 return result;
1755
1756=== modified file 'src/main/java/dk/aau/cs/approximation/ApproximationWorker.java'
1757--- src/dk/aau/cs/approximation/ApproximationWorker.java 2020-12-16 21:11:57 +0000
1758+++ src/main/java/dk/aau/cs/approximation/ApproximationWorker.java 2022-07-21 13:30:11 +0000
1759@@ -2,9 +2,12 @@
1760
1761 import java.math.BigDecimal;
1762
1763-import pipe.dataLayer.TAPNQuery.TraceOption;
1764-import pipe.gui.RunVerificationBase;
1765-import pipe.gui.widgets.InclusionPlaces;
1766+import net.tapaal.gui.petrinet.TAPNLens;
1767+import pipe.gui.petrinet.dataLayer.DataLayer;
1768+import net.tapaal.gui.petrinet.verification.TAPNQuery.TraceOption;
1769+import pipe.gui.TAPAALGUI;
1770+import net.tapaal.gui.petrinet.verification.RunVerificationBase;
1771+import net.tapaal.gui.petrinet.verification.InclusionPlaces;
1772 import dk.aau.cs.Messenger;
1773 import dk.aau.cs.io.batchProcessing.LoadedBatchProcessingModel;
1774 import dk.aau.cs.model.tapn.TAPNQuery;
1775@@ -32,14 +35,17 @@
1776
1777 public class ApproximationWorker {
1778 public VerificationResult<TAPNNetworkTrace> normalWorker(
1779- VerificationOptions options,
1780- ModelChecker modelChecker,
1781- Tuple<TimedArcPetriNet, NameMapping> transformedModel,
1782- ITAPNComposer composer,
1783- TAPNQuery clonedQuery,
1784- RunVerificationBase verificationBase,
1785- TimedArcPetriNetNetwork model
1786- ) throws Exception {
1787+ VerificationOptions options,
1788+ ModelChecker modelChecker,
1789+ Tuple<TimedArcPetriNet, NameMapping> transformedModel,
1790+ ITAPNComposer composer,
1791+ TAPNQuery clonedQuery,
1792+ RunVerificationBase verificationBase,
1793+ TimedArcPetriNetNetwork model,
1794+ DataLayer guiModel,
1795+ net.tapaal.gui.petrinet.verification.TAPNQuery dataLayerQuery,
1796+ TAPNLens lens
1797+ ) throws Exception {
1798
1799 // If options is of an instance of VerifyTAPNOptions then save the inclusion places before verify alters them
1800 InclusionPlaces oldInclusionPlaces = null;
1801@@ -53,7 +59,9 @@
1802 }
1803
1804 VerificationResult<TAPNNetworkTrace> toReturn = null;
1805- VerificationResult<TimedArcPetriNetTrace> result = modelChecker.verify(options, transformedModel, clonedQuery);
1806+ VerificationResult<TimedArcPetriNetTrace> result;
1807+
1808+ result = modelChecker.verify(options, transformedModel, clonedQuery, guiModel, dataLayerQuery, lens);
1809
1810 if (result.error()) {
1811 options.setTraceOption(oldTraceOption);
1812@@ -66,14 +74,19 @@
1813 // If r = 1
1814 // No matter what it answered -> return that answer
1815 QueryResult queryResult = result.getQueryResult();
1816- toReturn = new VerificationResult<TAPNNetworkTrace>(
1817- queryResult,
1818- decomposeTrace(result.getTrace(), transformedModel.value2(), model),
1819- decomposeTrace(result.getSecondaryTrace(), transformedModel.value2(), model),
1820- result.verificationTime(),
1821- result.stats(),
1822- result.isSolvedUsingStateEquation());
1823- toReturn.setNameMapping(transformedModel.value2());
1824+ NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
1825+ TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
1826+ toReturn = new VerificationResult<TAPNNetworkTrace>(
1827+ queryResult,
1828+ decomposeTrace(result.getTrace(), nameMapping, netNetwork),
1829+ decomposeTrace(result.getSecondaryTrace(), nameMapping, netNetwork),
1830+ result.verificationTime(),
1831+ result.stats(),
1832+ false,
1833+ result.getUnfoldedModel());
1834+ toReturn.setNameMapping(transformedModel.value2());
1835+
1836+
1837 } else {
1838 // If r > 1
1839 if (result.getTrace() != null && (((result.getQueryResult().queryType() == QueryType.EF || result.getQueryResult().queryType() == QueryType.EG) && result.getQueryResult().isQuerySatisfied())
1840@@ -82,14 +95,17 @@
1841 // The results are inconclusive, but we get a trace and can use trace TAPN for verification.
1842
1843 VerificationResult<TimedArcPetriNetTrace> approxResult = result;
1844- toReturn = new VerificationResult<TAPNNetworkTrace>(
1845- approxResult.getQueryResult(),
1846- decomposeTrace(approxResult.getTrace(), transformedModel.value2(), model),
1847- decomposeTrace(approxResult.getSecondaryTrace(), transformedModel.value2(), model),
1848- approxResult.verificationTime(),
1849- approxResult.stats(),
1850- approxResult.isSolvedUsingStateEquation());
1851- toReturn.setNameMapping(transformedModel.value2());
1852+ NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
1853+ TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
1854+ toReturn = new VerificationResult<TAPNNetworkTrace>(
1855+ approxResult.getQueryResult(),
1856+ decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
1857+ decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
1858+ approxResult.verificationTime(),
1859+ approxResult.stats(),
1860+ false,
1861+ approxResult.getUnfoldedModel());
1862+ toReturn.setNameMapping(nameMapping);
1863
1864 OverApproximation overaprx = new OverApproximation();
1865
1866@@ -103,7 +119,7 @@
1867
1868 // run model checker again for trace TAPN
1869 MemoryMonitor.cumulateMemory();
1870- result = modelChecker.verify(options, transformedOriginalModel, clonedQuery);
1871+ result = modelChecker.verify(options, transformedOriginalModel, clonedQuery, guiModel, dataLayerQuery, null);
1872
1873 if (result.error()) {
1874 options.setTraceOption(oldTraceOption);
1875@@ -127,14 +143,17 @@
1876
1877 // If satisfied trace -> Return result
1878 // This is satisfied for EF and EG and not satisfied for AG and AF
1879- toReturn = new VerificationResult<TAPNNetworkTrace>(
1880- queryResult,
1881- decomposeTrace(result.getTrace(), transformedModel.value2(), model),
1882- decomposeTrace(result.getSecondaryTrace(), transformedModel.value2(), model),
1883- approxResult.verificationTime() + result.verificationTime(),
1884- approxResult.stats(),
1885- approxResult.isSolvedUsingStateEquation());
1886- toReturn.setNameMapping(transformedModel.value2());
1887+ toReturn = new VerificationResult<TAPNNetworkTrace>(
1888+ queryResult,
1889+ decomposeTrace(result.getTrace(), nameMapping, netNetwork),
1890+ decomposeTrace(result.getSecondaryTrace(), nameMapping, netNetwork),
1891+ approxResult.verificationTime() + result.verificationTime(),
1892+ approxResult.stats(),
1893+ false,
1894+ approxResult.getUnfoldedModel());
1895+ toReturn.setNameMapping(nameMapping);
1896+
1897+
1898 }
1899 else if (((result.getQueryResult().queryType() == QueryType.EF || result.getQueryResult().queryType() == QueryType.EG) && !result.getQueryResult().isQuerySatisfied())
1900 || ((result.getQueryResult().queryType() == QueryType.AG || result.getQueryResult().queryType() == QueryType.AF) && result.getQueryResult().isQuerySatisfied())) {
1901@@ -147,14 +166,19 @@
1902 }
1903
1904 VerificationResult<TimedArcPetriNetTrace> approxResult = result;
1905- toReturn = new VerificationResult<TAPNNetworkTrace>(
1906- approxResult.getQueryResult(),
1907- decomposeTrace(approxResult.getTrace(), transformedModel.value2(), model),
1908- decomposeTrace(approxResult.getSecondaryTrace(), transformedModel.value2(), model),
1909- approxResult.verificationTime(),
1910- approxResult.stats(),
1911- approxResult.isSolvedUsingStateEquation());
1912- toReturn.setNameMapping(transformedModel.value2());
1913+ NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
1914+ TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
1915+ toReturn = new VerificationResult<TAPNNetworkTrace>(
1916+ approxResult.getQueryResult(),
1917+ decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
1918+ decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
1919+ approxResult.verificationTime(),
1920+ approxResult.stats(),
1921+ false,
1922+ approxResult.getUnfoldedModel());
1923+ toReturn.setNameMapping(nameMapping);
1924+
1925+
1926 } else {
1927 // We cannot use the result directly, and did not get a trace.
1928
1929@@ -162,15 +186,18 @@
1930 queryResult.setApproximationInconclusive(true);
1931
1932 VerificationResult<TimedArcPetriNetTrace> approxResult = result;
1933- toReturn = new VerificationResult<TAPNNetworkTrace>(
1934- approxResult.getQueryResult(),
1935- decomposeTrace(approxResult.getTrace(), transformedModel.value2(), model),
1936- decomposeTrace(approxResult.getSecondaryTrace(), transformedModel.value2(), model),
1937- approxResult.verificationTime(),
1938- approxResult.stats(),
1939- approxResult.isSolvedUsingStateEquation());
1940- toReturn.setNameMapping(transformedModel.value2());
1941-
1942+ NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
1943+ TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
1944+ toReturn = new VerificationResult<TAPNNetworkTrace>(
1945+ approxResult.getQueryResult(),
1946+ decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
1947+ decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
1948+ approxResult.verificationTime(),
1949+ approxResult.stats(),
1950+ false,
1951+ approxResult.getUnfoldedModel());
1952+ toReturn.setNameMapping(nameMapping);
1953+
1954 }
1955 }
1956 }
1957@@ -194,14 +221,19 @@
1958 // If r = 1
1959 // No matter it answered -> return that answer
1960 QueryResult queryResult= result.getQueryResult();
1961- toReturn = new VerificationResult<TAPNNetworkTrace>(
1962- queryResult,
1963- decomposeTrace(result.getTrace(), transformedModel.value2(), model),
1964- decomposeTrace(result.getSecondaryTrace(), transformedModel.value2(), model),
1965- result.verificationTime(),
1966- result.stats(),
1967- result.isSolvedUsingStateEquation());
1968- toReturn.setNameMapping(transformedModel.value2());
1969+ NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
1970+ TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
1971+ toReturn = new VerificationResult<TAPNNetworkTrace>(
1972+ queryResult,
1973+ decomposeTrace(result.getTrace(), nameMapping, netNetwork),
1974+ decomposeTrace(result.getSecondaryTrace(), nameMapping, netNetwork),
1975+ result.verificationTime(),
1976+ result.stats(),
1977+ false,
1978+ result.getUnfoldedModel());
1979+ toReturn.setNameMapping(nameMapping);
1980+
1981+
1982 }
1983 else {
1984 // If r > 1
1985@@ -210,14 +242,18 @@
1986 // If ((EF OR EG) AND not satisfied) OR ((AG OR AF) and satisfied) -> Inconclusive
1987 QueryResult queryResult= result.getQueryResult();
1988 queryResult.setApproximationInconclusive(true);
1989- toReturn = new VerificationResult<TAPNNetworkTrace>(
1990- queryResult,
1991- decomposeTrace(result.getTrace(), transformedModel.value2(), model),
1992- decomposeTrace(result.getSecondaryTrace(), transformedModel.value2(), model),
1993- result.verificationTime(),
1994- result.stats(),
1995- result.isSolvedUsingStateEquation());
1996- toReturn.setNameMapping(transformedModel.value2());
1997+ NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
1998+ TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
1999+ toReturn = new VerificationResult<TAPNNetworkTrace>(
2000+ queryResult,
2001+ decomposeTrace(result.getTrace(), nameMapping, netNetwork),
2002+ decomposeTrace(result.getSecondaryTrace(), nameMapping, netNetwork),
2003+ result.verificationTime(),
2004+ result.stats(),
2005+ false,
2006+ result.getUnfoldedModel());
2007+ toReturn.setNameMapping(nameMapping);
2008+
2009 } else if ((result.getQueryResult().queryType() == QueryType.EF || result.getQueryResult().queryType() == QueryType.EG) && result.getQueryResult().isQuerySatisfied()
2010 || ((result.getQueryResult().queryType() == QueryType.AG || result.getQueryResult().queryType() == QueryType.AF) && ! result.getQueryResult().isQuerySatisfied())) {
2011
2012@@ -225,14 +261,19 @@
2013 // If query does have deadlock or EG or AF a trace -> create trace TAPN
2014 //Create the verification satisfied result for the approximation
2015 VerificationResult<TimedArcPetriNetTrace> approxResult = result;
2016- toReturn = new VerificationResult<TAPNNetworkTrace>(
2017- approxResult.getQueryResult(),
2018- decomposeTrace(approxResult.getTrace(), transformedModel.value2(), model),
2019- decomposeTrace(approxResult.getSecondaryTrace(), transformedModel.value2(), model),
2020- approxResult.verificationTime(),
2021- approxResult.stats(),
2022- result.isSolvedUsingStateEquation());
2023- toReturn.setNameMapping(transformedModel.value2());
2024+ NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
2025+ TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
2026+ toReturn = new VerificationResult<TAPNNetworkTrace>(
2027+ approxResult.getQueryResult(),
2028+ decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
2029+ decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
2030+ approxResult.verificationTime(),
2031+ approxResult.stats(),
2032+ false,
2033+ result.getUnfoldedModel());
2034+ toReturn.setNameMapping(nameMapping);
2035+
2036+
2037
2038 OverApproximation overaprx = new OverApproximation();
2039
2040@@ -247,7 +288,7 @@
2041
2042 //run model checker again for trace TAPN
2043 MemoryMonitor.cumulateMemory();
2044- result = modelChecker.verify(options, transformedOriginalModel, clonedQuery);
2045+ result = modelChecker.verify(options, transformedOriginalModel, clonedQuery, guiModel, dataLayerQuery, null);
2046
2047 if (result.error()) {
2048 options.setTraceOption(oldTraceOption);
2049@@ -271,16 +312,17 @@
2050 || (result.getQueryResult().queryType() == QueryType.AF && queryResult.isQuerySatisfied())) {
2051 queryResult.setApproximationInconclusive(true);
2052 }
2053-
2054+
2055 // If satisfied trace) -> Return result
2056 // This is satisfied for EF and EG and not satisfied for AG and AF
2057 toReturn = new VerificationResult<TAPNNetworkTrace>(
2058 queryResult,
2059- decomposeTrace(result.getTrace(), transformedModel.value2(), model),
2060- decomposeTrace(result.getSecondaryTrace(), transformedModel.value2(), model),
2061+ decomposeTrace(result.getTrace(), nameMapping, netNetwork),
2062+ decomposeTrace(result.getSecondaryTrace(), nameMapping, netNetwork),
2063 approxResult.verificationTime() + result.verificationTime(),
2064 approxResult.stats(),
2065- approxResult.isSolvedUsingStateEquation());
2066+ false,
2067+ approxResult.getUnfoldedModel());
2068 toReturn.setNameMapping(transformedModel.value2());
2069 }
2070 else {
2071@@ -289,28 +331,36 @@
2072 queryResult.setApproximationInconclusive(true);
2073
2074 VerificationResult<TimedArcPetriNetTrace> approxResult = result;
2075+ NameMapping nameMapping = model.isColored()? result.getUnfoldedModel().value2(): transformedModel.value2();
2076+ TimedArcPetriNetNetwork netNetwork = model.isColored()? result.getUnfoldedModel().value1().parentNetwork(): model;
2077+
2078 toReturn = new VerificationResult<TAPNNetworkTrace>(
2079 approxResult.getQueryResult(),
2080- decomposeTrace(approxResult.getTrace(), transformedModel.value2(), model),
2081- decomposeTrace(approxResult.getSecondaryTrace(), transformedModel.value2(), model),
2082+ decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
2083+ decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
2084 approxResult.verificationTime(),
2085 approxResult.stats(),
2086- approxResult.isSolvedUsingStateEquation());
2087- toReturn.setNameMapping(transformedModel.value2());
2088+ false,
2089+ approxResult.getUnfoldedModel());
2090+ toReturn.setNameMapping(nameMapping);
2091 }
2092 }
2093 }
2094 }
2095 else {
2096+ boolean isColored = (lens != null && lens.isColored() || model.isColored());
2097+ NameMapping nameMapping = isColored? result.getUnfoldedModel().value2(): transformedModel.value2();
2098+ TimedArcPetriNetNetwork netNetwork = isColored? result.getUnfoldedModel().value1().parentNetwork(): model;
2099 toReturn = new VerificationResult<TAPNNetworkTrace>(
2100 result.getQueryResult(),
2101- decomposeTrace(result.getTrace(), transformedModel.value2(), model),
2102- decomposeTrace(result.getSecondaryTrace(), transformedModel.value2(), model),
2103+ decomposeTrace(result.getTrace(), nameMapping, netNetwork),
2104+ decomposeTrace(result.getSecondaryTrace(), nameMapping, netNetwork),
2105 result.verificationTime(),
2106 result.stats(),
2107- result.isSolvedUsingStateEquation(),
2108- result.getRawOutput());
2109- toReturn.setNameMapping(transformedModel.value2());
2110+ false,
2111+ result.getRawOutput(),
2112+ result.getUnfoldedModel());
2113+ toReturn.setNameMapping(nameMapping);
2114 }
2115
2116 options.setTraceOption(oldTraceOption);
2117@@ -326,7 +376,7 @@
2118 public VerificationResult<TimedArcPetriNetTrace> batchWorker(
2119 Tuple<TimedArcPetriNet, NameMapping> composedModel,
2120 VerificationOptions options,
2121- pipe.dataLayer.TAPNQuery query,
2122+ net.tapaal.gui.petrinet.verification.TAPNQuery query,
2123 LoadedBatchProcessingModel model,
2124 ModelChecker modelChecker,
2125 TAPNQuery queryToVerify,
2126@@ -354,7 +404,7 @@
2127 options.setTraceOption(TraceOption.SOME);
2128 }
2129
2130- VerificationResult<TimedArcPetriNetTrace> verificationResult = modelChecker.verify(options, composedModel, queryToVerify);
2131+ VerificationResult<TimedArcPetriNetTrace> verificationResult = modelChecker.verify(options, composedModel, queryToVerify, null, query, null);
2132
2133 VerificationResult<TAPNNetworkTrace> valueNetwork = null; //The final result is meant to be a PetriNetTrace but to make traceTAPN we make a networktrace
2134 VerificationResult<TimedArcPetriNetTrace> value = null;
2135@@ -376,7 +426,8 @@
2136 verificationResult.getSecondaryTrace(),
2137 verificationResult.verificationTime(),
2138 verificationResult.stats(),
2139- verificationResult.isSolvedUsingStateEquation());
2140+ false,
2141+ verificationResult.getUnfoldedModel());
2142 value.setNameMapping(composedModel.value2());
2143 } else {
2144 // If r > 1
2145@@ -385,14 +436,17 @@
2146 // If ((EF OR EG) AND satisfied) OR ((AG OR AF) AND not satisfied)
2147 //Create the verification satisfied result for the approximation
2148 VerificationResult<TimedArcPetriNetTrace> approxResult = verificationResult;
2149+ NameMapping nameMapping = model.network().isColored()? verificationResult.getUnfoldedModel().value2(): composedModel.value2();
2150+ TimedArcPetriNetNetwork netNetwork = model.network().isColored()? verificationResult.getUnfoldedModel().value1().parentNetwork(): model.network();
2151 valueNetwork = new VerificationResult<TAPNNetworkTrace>(
2152 approxResult.getQueryResult(),
2153- decomposeTrace(approxResult.getTrace(), composedModel.value2(), model.network()),
2154- decomposeTrace(approxResult.getSecondaryTrace(), composedModel.value2(), model.network()),
2155+ decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
2156+ decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
2157 approxResult.verificationTime(),
2158 approxResult.stats(),
2159- verificationResult.isSolvedUsingStateEquation());
2160- valueNetwork.setNameMapping(composedModel.value2());
2161+ false,
2162+ verificationResult.getUnfoldedModel());
2163+ valueNetwork.setNameMapping(nameMapping);
2164
2165 OverApproximation overaprx = new OverApproximation();
2166
2167@@ -406,7 +460,7 @@
2168
2169 //run model checker again for trace TAPN
2170 MemoryMonitor.cumulateMemory();
2171- verificationResult = modelChecker.verify(options, transformedOriginalModel, clonedQuery);
2172+ verificationResult = modelChecker.verify(options, transformedOriginalModel, clonedQuery, null, query, null);
2173
2174 if (verificationResult.error()) {
2175 options.setTraceOption(oldTraceOption);
2176@@ -432,7 +486,8 @@
2177 approxResult.getSecondaryTrace(),
2178 approxResult.verificationTime() + verificationResult.verificationTime(),
2179 approxResult.stats(),
2180- verificationResult.isSolvedUsingStateEquation());
2181+ false,
2182+ verificationResult.getUnfoldedModel());
2183 value.setNameMapping(composedModel.value2());
2184 }
2185 else if (((verificationResult.getQueryResult().queryType() == QueryType.EF || verificationResult.getQueryResult().queryType() == QueryType.EG) && !verificationResult.getQueryResult().isQuerySatisfied())
2186@@ -451,7 +506,8 @@
2187 verificationResult.getSecondaryTrace(),
2188 verificationResult.verificationTime(),
2189 verificationResult.stats(),
2190- verificationResult.isSolvedUsingStateEquation());
2191+ false,
2192+ verificationResult.getUnfoldedModel());
2193 value.setNameMapping(composedModel.value2());
2194 }
2195 else {
2196@@ -467,7 +523,8 @@
2197 verificationResult.getSecondaryTrace(),
2198 verificationResult.verificationTime(),
2199 verificationResult.stats(),
2200- verificationResult.isSolvedUsingStateEquation());
2201+ false,
2202+ verificationResult.getUnfoldedModel());
2203 value.setNameMapping(composedModel.value2());
2204 }
2205 }
2206@@ -485,7 +542,8 @@
2207 verificationResult.getSecondaryTrace(),
2208 verificationResult.verificationTime(),
2209 verificationResult.stats(),
2210- verificationResult.isSolvedUsingStateEquation());
2211+ false,
2212+ verificationResult.getUnfoldedModel());
2213 value.setNameMapping(composedModel.value2());
2214 }
2215 else {
2216@@ -502,7 +560,8 @@
2217 verificationResult.getSecondaryTrace(),
2218 verificationResult.verificationTime(),
2219 verificationResult.stats(),
2220- verificationResult.isSolvedUsingStateEquation());
2221+ false,
2222+ verificationResult.getUnfoldedModel());
2223 value.setNameMapping(composedModel.value2());
2224
2225 }
2226@@ -514,14 +573,20 @@
2227 // If query does have deadlock -> create trace TAPN
2228 //Create the verification satisfied result for the approximation
2229 VerificationResult<TimedArcPetriNetTrace> approxResult = verificationResult;
2230- valueNetwork = new VerificationResult<TAPNNetworkTrace>(
2231- approxResult.getQueryResult(),
2232- decomposeTrace(approxResult.getTrace(), composedModel.value2(), model.network()),
2233- decomposeTrace(approxResult.getSecondaryTrace(), composedModel.value2(), model.network()),
2234- approxResult.verificationTime(),
2235- approxResult.stats(),
2236- approxResult.isSolvedUsingStateEquation());
2237- valueNetwork.setNameMapping(composedModel.value2());
2238+
2239+ NameMapping nameMapping = model.network().isColored()? verificationResult.getUnfoldedModel().value2(): composedModel.value2();
2240+ TimedArcPetriNetNetwork netNetwork = model.network().isColored()? verificationResult.getUnfoldedModel().value1().parentNetwork(): model.network();
2241+ valueNetwork = new VerificationResult<TAPNNetworkTrace>(
2242+ approxResult.getQueryResult(),
2243+ decomposeTrace(approxResult.getTrace(), nameMapping, netNetwork),
2244+ decomposeTrace(approxResult.getSecondaryTrace(), nameMapping, netNetwork),
2245+ approxResult.verificationTime(),
2246+ approxResult.stats(),
2247+ false,
2248+ verificationResult.getUnfoldedModel());
2249+ valueNetwork.setNameMapping(nameMapping);
2250+
2251+
2252
2253 OverApproximation overaprx = new OverApproximation();
2254
2255@@ -534,7 +599,7 @@
2256
2257 //run model checker again for trace TAPN
2258 MemoryMonitor.cumulateMemory();
2259- verificationResult = modelChecker.verify(options, transformedOriginalModel, clonedQuery);
2260+ verificationResult = modelChecker.verify(options, transformedOriginalModel, clonedQuery, null, query, null);
2261
2262 if (verificationResult.error()) {
2263 options.setTraceOption(oldTraceOption);
2264@@ -564,7 +629,8 @@
2265 verificationResult.getSecondaryTrace(),
2266 verificationResult.verificationTime() + approxResult.verificationTime(),
2267 verificationResult.stats(),
2268- verificationResult.isSolvedUsingStateEquation());
2269+ false,
2270+ verificationResult.getUnfoldedModel());
2271 value.setNameMapping(composedModel.value2());
2272 }
2273 else {
2274@@ -578,7 +644,8 @@
2275 verificationResult.getSecondaryTrace(),
2276 verificationResult.verificationTime(),
2277 verificationResult.stats(),
2278- verificationResult.isSolvedUsingStateEquation());
2279+ false,
2280+ verificationResult.getUnfoldedModel());
2281 value.setNameMapping(composedModel.value2());
2282 }
2283 }
2284@@ -591,7 +658,8 @@
2285 verificationResult.getSecondaryTrace(),
2286 verificationResult.verificationTime(),
2287 verificationResult.stats(),
2288- verificationResult.isSolvedUsingStateEquation());
2289+ false,
2290+ verificationResult.getUnfoldedModel());
2291 value.setNameMapping(composedModel.value2());
2292 }
2293
2294
2295=== modified file 'src/main/java/dk/aau/cs/approximation/OverApproximation.java'
2296--- src/dk/aau/cs/approximation/OverApproximation.java 2020-07-20 12:17:24 +0000
2297+++ src/main/java/dk/aau/cs/approximation/OverApproximation.java 2022-07-21 13:30:11 +0000
2298@@ -13,6 +13,7 @@
2299 import dk.aau.cs.TCTL.TCTLNotNode;
2300 import dk.aau.cs.TCTL.TCTLOrListNode;
2301 import dk.aau.cs.TCTL.TCTLPlaceNode;
2302+import dk.aau.cs.model.CPN.ColorType;
2303 import dk.aau.cs.model.tapn.*;
2304 import dk.aau.cs.model.tapn.simulation.*;
2305 import dk.aau.cs.util.Tuple;
2306@@ -69,18 +70,18 @@
2307 oldInterval.isUpperBoundNonStrict()
2308 );
2309 }
2310-
2311+
2312 public void makeTraceTAPN(Tuple<TimedArcPetriNet, NameMapping> transformedModel, VerificationResult<TAPNNetworkTrace> result, dk.aau.cs.model.tapn.TAPNQuery query) {
2313 TimedArcPetriNet net = transformedModel.value1();
2314
2315 LocalTimedPlace currentPlace = new LocalTimedPlace("PTRACE0");
2316- TimedToken currentToken = new TimedToken(currentPlace);
2317+ TimedToken currentToken = new TimedToken(currentPlace, ColorType.COLORTYPE_DOT.getFirstColor());
2318 net.add(currentPlace);
2319 currentPlace.addToken(currentToken);
2320
2321 // Block place, which secures the net makes at most one transition not in the trace.
2322- LocalTimedPlace blockPlace = new LocalTimedPlace("PBLOCK", TimeInvariant.LESS_THAN_INFINITY);
2323- TimedToken blockToken = new TimedToken(blockPlace);
2324+ LocalTimedPlace blockPlace = new LocalTimedPlace("PBLOCK");
2325+ TimedToken blockToken = new TimedToken(blockPlace, ColorType.COLORTYPE_DOT.getFirstColor());
2326 net.add(blockPlace);
2327 blockPlace.addToken(blockToken);
2328
2329@@ -140,7 +141,7 @@
2330 (((TAPNNetworkTimedTransitionStep) step).getTransition().sharedTransition() == null ? tmpStep.getTransition().model().name() : ""),
2331 tmpStep.getTransition().name());
2332 TimedTransition firedTransition = net.getTransitionByName(nameMap.get(key));
2333- TimedTransition copyTransition = new TimedTransition(firedTransition.name() + "_traceNet_" + Integer.toString(++transitionInteger), firedTransition.isUrgent());
2334+ TimedTransition copyTransition = new TimedTransition(firedTransition.name() + "_traceNet_" + Integer.toString(++transitionInteger), firedTransition.isUrgent(), null);
2335
2336 net.add(copyTransition);
2337 net.add(new TimedInputArc(currentPlace, copyTransition, TimeInterval.ZERO_INF));
2338@@ -163,17 +164,17 @@
2339
2340 for (TimedInputArc arc : originalInput) {
2341 if (arc.destination() == firedTransition) {
2342- net.add(new TimedInputArc(arc.source(), copyTransition, arc.interval(), arc.getWeight()));
2343+ net.add(new TimedInputArc(arc.source(), copyTransition, arc.interval(), arc.getWeight(), arc.getArcExpression()));
2344 }
2345 }
2346 for (TimedOutputArc arc : originalOutput) {
2347 if (arc.source() == firedTransition) {
2348- net.add(new TimedOutputArc(copyTransition, arc.destination(), arc.getWeight()));
2349+ net.add(new TimedOutputArc(copyTransition, arc.destination(), arc.getWeight(), arc.getExpression()));
2350 }
2351 }
2352 for (TimedInhibitorArc arc : originalInhibitor) {
2353 if (arc.destination() == firedTransition) {
2354- net.add(new TimedInhibitorArc(arc.source(), copyTransition, arc.interval(), arc.getWeight()));
2355+ net.add(new TimedInhibitorArc(arc.source(), copyTransition, arc.interval(), arc.getWeight(), arc.getArcExpression()));
2356 }
2357 }
2358 for (TransportArc arc : originalTransport) {
2359@@ -200,7 +201,7 @@
2360
2361 // An input arc from pBlock to all original transitions makes sure, that we can do deadlock checks.
2362 for (TimedTransition transition : originalTransitions) {
2363- net.add(new TimedInputArc(blockPlace, transition, TimeInterval.ZERO_INF));
2364+ net.add(new TimedInputArc(blockPlace, transition, TimeInterval.ZERO_INF));
2365 }
2366 }
2367
2368
2369=== modified file 'src/main/java/dk/aau/cs/approximation/UnderApproximation.java'
2370--- src/dk/aau/cs/approximation/UnderApproximation.java 2020-07-20 12:17:24 +0000
2371+++ src/main/java/dk/aau/cs/approximation/UnderApproximation.java 2022-07-21 13:30:11 +0000
2372@@ -1,23 +1,13 @@
2373 package dk.aau.cs.approximation;
2374
2375+import dk.aau.cs.model.tapn.*;
2376+import pipe.gui.petrinet.dataLayer.DataLayer;
2377+import pipe.gui.petrinet.graphicElements.Arc;
2378+import pipe.gui.petrinet.graphicElements.Place;
2379+import pipe.gui.petrinet.graphicElements.Transition;
2380+
2381 import java.util.ArrayList;
2382
2383-import dk.aau.cs.model.tapn.Bound;
2384-import dk.aau.cs.model.tapn.IntBound;
2385-import dk.aau.cs.model.tapn.TimeInterval;
2386-import dk.aau.cs.model.tapn.TimeInvariant;
2387-import dk.aau.cs.model.tapn.TimedArcPetriNet;
2388-import dk.aau.cs.model.tapn.TimedInhibitorArc;
2389-import dk.aau.cs.model.tapn.TimedInputArc;
2390-import dk.aau.cs.model.tapn.TimedOutputArc;
2391-import dk.aau.cs.model.tapn.TimedPlace;
2392-import dk.aau.cs.model.tapn.TimedTransition;
2393-import dk.aau.cs.model.tapn.TransportArc;
2394-import pipe.dataLayer.DataLayer;
2395-import pipe.gui.graphicElements.Arc;
2396-import pipe.gui.graphicElements.Place;
2397-import pipe.gui.graphicElements.Transition;
2398-
2399 public class UnderApproximation implements ITAPNApproximation {
2400 @Override
2401 public void modifyTAPN(TimedArcPetriNet net, int approximationDenominator) {
2402@@ -141,44 +131,42 @@
2403 }
2404
2405 //Returns a copy of an approximated interval
2406- private TimeInterval modifyIntervals(TimeInterval oldInterval, int denominator){
2407- Bound newUpperBound;
2408- // Do not calculate upper bound for infinite
2409- if ( ! (oldInterval.upperBound() instanceof Bound.InfBound)) {
2410-
2411- // Calculate the new upper bound value.
2412- int oldUpperBoundValue = oldInterval.upperBound().value();
2413- newUpperBound = new IntBound((int) Math.floor((double)oldUpperBoundValue / denominator));
2414- }
2415- else
2416- newUpperBound = Bound.Infinity;
2417-
2418- // Calculate the new lower bound
2419- IntBound newLowerBound = new IntBound((int) Math.ceil((double)oldInterval.lowerBound().value() / denominator));
2420-
2421- // if the lower bound has become greater than the upper bound by rounding
2422- if ( ! (oldInterval.upperBound() instanceof Bound.InfBound) && newLowerBound.value() > newUpperBound.value())
2423- {
2424- newLowerBound = new IntBound((int) Math.floor((double)oldInterval.lowerBound().value() / denominator));
2425- newUpperBound = new IntBound((int) Math.floor((double)oldInterval.upperBound().value() / denominator));
2426- }
2427-
2428- boolean isLowerBoundNonStrict = oldInterval.isLowerBoundNonStrict();
2429- boolean isUpperBoundNonStrict = oldInterval.isUpperBoundNonStrict();
2430-
2431- // if the interval becomes too small we make it a bit bigger to secure, that we do not have to delete the arc
2432- if ( (newUpperBound.value() == newLowerBound.value()) && !(oldInterval.isLowerBoundNonStrict() && oldInterval.isUpperBoundNonStrict()))
2433- {
2434- isUpperBoundNonStrict = true;
2435- isLowerBoundNonStrict = true;
2436- }
2437-
2438- return new TimeInterval(
2439- isLowerBoundNonStrict,
2440- newLowerBound,
2441- newUpperBound,
2442- isUpperBoundNonStrict
2443- );
2444- }
2445+ private TimeInterval modifyIntervals(TimeInterval oldInterval, int denominator) {
2446+ Bound newUpperBound;
2447+ // Do not calculate upper bound for infinite
2448+ if (!(oldInterval.upperBound() instanceof Bound.InfBound)) {
2449+
2450+ // Calculate the new upper bound value.
2451+ int oldUpperBoundValue = oldInterval.upperBound().value();
2452+ newUpperBound = new IntBound((int) Math.floor((double) oldUpperBoundValue / denominator));
2453+ } else {
2454+ newUpperBound = Bound.Infinity;
2455+ }
2456+
2457+ // Calculate the new lower bound
2458+ IntBound newLowerBound = new IntBound((int) Math.ceil((double) oldInterval.lowerBound().value() / denominator));
2459+
2460+ // if the lower bound has become greater than the upper bound by rounding
2461+ if (!(oldInterval.upperBound() instanceof Bound.InfBound) && newLowerBound.value() > newUpperBound.value()) {
2462+ newLowerBound = new IntBound((int) Math.floor((double) oldInterval.lowerBound().value() / denominator));
2463+ newUpperBound = new IntBound((int) Math.floor((double) oldInterval.upperBound().value() / denominator));
2464+ }
2465+
2466+ boolean isLowerBoundNonStrict = oldInterval.isLowerBoundNonStrict();
2467+ boolean isUpperBoundNonStrict = oldInterval.isUpperBoundNonStrict();
2468+
2469+ // if the interval becomes too small we make it a bit bigger to secure, that we do not have to delete the arc
2470+ if ((newUpperBound.value() == newLowerBound.value()) && !(oldInterval.isLowerBoundNonStrict() && oldInterval.isUpperBoundNonStrict())) {
2471+ isUpperBoundNonStrict = true;
2472+ isLowerBoundNonStrict = true;
2473+ }
2474+
2475+ return new TimeInterval(
2476+ isLowerBoundNonStrict,
2477+ newLowerBound,
2478+ newUpperBound,
2479+ isUpperBoundNonStrict
2480+ );
2481+ }
2482
2483 }
2484
2485=== added file 'src/main/java/dk/aau/cs/io/LoadTACPN.java'
2486--- src/main/java/dk/aau/cs/io/LoadTACPN.java 1970-01-01 00:00:00 +0000
2487+++ src/main/java/dk/aau/cs/io/LoadTACPN.java 2022-07-21 13:30:11 +0000
2488@@ -0,0 +1,439 @@
2489+package dk.aau.cs.io;
2490+
2491+import dk.aau.cs.model.CPN.*;
2492+import dk.aau.cs.model.CPN.Expressions.*;
2493+import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;
2494+import dk.aau.cs.util.FormatException;
2495+import dk.aau.cs.util.Require;
2496+import dk.aau.cs.util.Tuple;
2497+import org.w3c.dom.Element;
2498+import org.w3c.dom.Node;
2499+
2500+import java.util.*;
2501+
2502+public 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
2503+
2504+ private final HashMap<String, ColorType> colortypes = new HashMap<>();
2505+ private final HashMap<String, Variable> variables = new HashMap<>();
2506+ private final HashMap<String, ColorExpression> tupleVarExpressions = new HashMap<>();
2507+ private final Collection<String> messages = new ArrayList<>(10);
2508+
2509+ public HashMap<String, ColorType> getColortypes() {
2510+ return colortypes;
2511+ }
2512+
2513+ public HashMap<String, Variable> getVariables() {
2514+ return variables;
2515+ }
2516+
2517+ public Collection<String> getMessages() {return messages;}
2518+ //skipWS
2519+ // Takes a given node and returns it if it is an element,
2520+ // otherwise returns its first element sibling.
2521+ // This allows skipping past whitespace nodes.
2522+ private static Node skipWS(Node node) {
2523+ if (node != null && !(node instanceof Element)) {
2524+ return skipWS(node.getNextSibling());
2525+ } else {
2526+ return node;
2527+ }
2528+ }
2529+
2530+ private static Node getAttribute(Node node, String attribute) {
2531+ return node.getAttributes().getNamedItem(attribute);
2532+ }
2533+
2534+ public void parseDeclarations(Node node, TimedArcPetriNetNetwork network) throws FormatException {
2535+ if(!(node instanceof Element)){
2536+ return;
2537+ }
2538+ Node child = skipWS(node.getFirstChild());
2539+ while(child != null){
2540+ String childName = child.getNodeName();
2541+ if (childName.equals("namedsort")){
2542+ parseNamedSort(child, network);
2543+ } else if (childName.equals("variabledecl")){
2544+ String id = getAttribute(child, "id").getNodeValue();
2545+ String name = getAttribute(child, "name").getNodeValue();
2546+ ColorType ct = parseUserSort(child);
2547+ Variable var = new Variable(name, id, ct);
2548+ Require.that(variables.put(id, var) == null, "the id " + id + ", was already used");
2549+ network.add(var);
2550+ } else {
2551+ parseDeclarations(child, network);
2552+ }
2553+
2554+ child = skipWS(child.getNextSibling());
2555+ }
2556+ Vector<String> variablesForRemoval = new Vector<>();
2557+ HashMap<String, Variable> newVars = new HashMap<>();
2558+ StringBuilder renameWarnings = new StringBuilder();
2559+ // Convert product variables into variables for the constituent of the product
2560+ for(String varName : variables.keySet()){
2561+ Variable var = variables.get(varName);
2562+ if(var.getColorType().isProductColorType()){
2563+ int constituentCounter = 1;
2564+
2565+ Vector<ColorExpression> constituentVarExpressions = new Vector<>();
2566+ renameWarnings.append("The product variable ").append(var.getName()).append(", was unfolded to (");
2567+
2568+ for(ColorType colorType : var.getColorType().getProductColorTypes()){
2569+ StringBuilder elementSubstring = new StringBuilder("_" + constituentCounter);
2570+ while (variables.containsKey(varName + elementSubstring) || newVars.containsKey(varName + elementSubstring)){
2571+ elementSubstring.append("_1");
2572+ }
2573+
2574+ renameWarnings.append(varName).append(elementSubstring).append(",");
2575+
2576+ Variable newVar = new Variable(var.getName() + elementSubstring, varName + elementSubstring, colorType);
2577+ Require.that(newVars.put(varName + elementSubstring, newVar) == null, "the id " + varName + elementSubstring + ", was already used");
2578+ network.add(newVar);
2579+ constituentVarExpressions.addElement(new VariableExpression(newVar));
2580+ constituentCounter++;
2581+ }
2582+ renameWarnings.deleteCharAt(renameWarnings.length()-1);
2583+ renameWarnings.append(")\n");
2584+
2585+ tupleVarExpressions.put(varName, new TupleExpression(constituentVarExpressions));
2586+ network.remove(var);
2587+ variablesForRemoval.addElement(varName);
2588+ }
2589+ }
2590+ for(String varName : variablesForRemoval){
2591+ variables.remove(varName);
2592+ }
2593+ for(String varName : newVars.keySet()){
2594+ variables.put(varName, newVars.get(varName));
2595+ }
2596+
2597+ if(renameWarnings.length() > 0){
2598+ messages.add(renameWarnings.toString());
2599+ //JOptionPane.showConfirmDialog(CreateGui.getApp(), renameWarnings.toString(), "Product Variables unfolded", JOptionPane.OK_OPTION, JOptionPane.WARNING_MESSAGE);
2600+ }
2601+ }
2602+ private void parseNamedSort(Node node, TimedArcPetriNetNetwork network) throws FormatException {
2603+ //We always use the dot colortype
2604+ colortypes.put("dot", ColorType.COLORTYPE_DOT);
2605+ network.add(ColorType.COLORTYPE_DOT);
2606+
2607+ Node type = skipWS(node.getFirstChild());
2608+ String typetag = type.getNodeName();
2609+ String name = getAttribute(node, "name").getNodeValue();
2610+ String id = getAttribute(node, "id").getNodeValue();
2611+
2612+ if (typetag.equals("productsort")) {
2613+ ProductType pt = new ProductType(name);
2614+ Node typechild = skipWS(type.getFirstChild());
2615+ while (typechild != null) {
2616+ if (typechild.getNodeName().equals("usersort")) {
2617+ String constituent = getAttribute(typechild, "declaration").getNodeValue();
2618+ pt.addType(colortypes.get(constituent));
2619+ }
2620+ typechild = skipWS(typechild.getNextSibling());
2621+ }
2622+ Require.that(colortypes.put(id, pt) == null, "the name " + id + ", was already used");
2623+ network.add(pt);
2624+ } else {
2625+ ColorType ct = new ColorType(name, id);
2626+ if (typetag.equals("dot")) {
2627+ return;
2628+ } else if (typetag.equals("finiteintrange")){
2629+ int start = Integer.parseInt(getAttribute(type, "start").getNodeValue());
2630+ int end = Integer.parseInt(getAttribute(type, "end").getNodeValue());
2631+ for(int i = start; i <= end; i++){
2632+ ct.addColor(String.valueOf(i));
2633+ }
2634+ } else {
2635+ Node typechild = skipWS(type.getFirstChild());
2636+ while (typechild != null) {
2637+ Node colorId = getAttribute(typechild, "id");
2638+ if (colorId != null) {
2639+ ct.addColor(colorId.getNodeValue());
2640+ typechild = skipWS(typechild.getNextSibling());
2641+ } else {
2642+ throw new FormatException(String.format("No id found on %s\n", typechild.getNodeName()));
2643+ }
2644+ }
2645+ }
2646+ Require.that(colortypes.put(id, ct) == null, "the name " + id + ", was already used");
2647+ network.add(ct);
2648+ }
2649+ }
2650+
2651+ public ColorType parseUserSort(Node node) throws FormatException {
2652+ if (node instanceof Element) {
2653+ Node child = skipWS(node.getFirstChild());
2654+ while (child != null) {
2655+ String name = child.getNodeName();
2656+ if (name.equals("usersort")) {
2657+ Node decl = getAttribute(child, "declaration");
2658+ return colortypes.get(decl.getNodeValue());
2659+ } else if (name.matches("structure|type|subterm")) {
2660+ return parseUserSort(child);
2661+ }
2662+ child = skipWS(child.getNextSibling());
2663+ }
2664+ }
2665+ throw new FormatException(String.format("Could not parse %s as an usersort\n", node.getNodeName()));
2666+ }
2667+
2668+ public ArcExpression parseArcExpression(Node node) throws FormatException {
2669+ String name = node.getNodeName();
2670+ if (name.equals("numberof")) {
2671+ return parseNumberOfExpression(node);
2672+ } else if (name.equals("add")) {
2673+ Vector<ArcExpression> constituents = new Vector<>();
2674+
2675+ Node child = skipWS(node.getFirstChild());
2676+ while (child != null) {
2677+ ArcExpression subterm = parseArcExpression(child);
2678+ constituents.add(subterm);
2679+ child = skipWS(child.getNextSibling());
2680+ }
2681+ return new AddExpression(constituents);
2682+ } else if (name.equals("subtract")) {
2683+ Node headchild = skipWS(node.getFirstChild());
2684+ ArcExpression headexp = parseArcExpression(headchild);
2685+
2686+ Node nextchild = skipWS(headchild.getNextSibling());
2687+ while (nextchild != null) {
2688+ ArcExpression nextexp = parseArcExpression(nextchild);
2689+ headexp = new SubtractExpression(headexp, nextexp);
2690+ nextchild = skipWS(nextchild.getNextSibling());
2691+ }
2692+ return headexp;
2693+ } else if (name.equals("scalarproduct")) {
2694+ Node scalar = skipWS(node.getFirstChild());
2695+ Integer scalarval = parseNumberConstantExpression(scalar);
2696+
2697+ Node child = skipWS(scalar.getNextSibling());
2698+ ArcExpression childexp = parseArcExpression(child);
2699+
2700+ return new ScalarProductExpression(scalarval, childexp);
2701+ }else if (name.equals("all")){
2702+ ColorType ct = parseUserSort(node);
2703+ Vector<ColorExpression> ceVector = new Vector<>();
2704+ ceVector.add(new AllExpression(ct));
2705+ return new NumberOfExpression(1,ceVector);
2706+
2707+ } else if (name.matches("subterm|structure")) {
2708+ Node child = skipWS(node.getFirstChild());
2709+ return parseArcExpression(child);
2710+ } else if (name.matches("tuple")){
2711+ Vector<ColorExpression> ceVector = new Vector<>();
2712+ ceVector.add(parseColorExpression(node));
2713+ return new NumberOfExpression(1, ceVector);
2714+ } else{
2715+ throw new FormatException(String.format("Could not parse %s as an arc expression\n", name));
2716+ }
2717+ }
2718+
2719+ private NumberOfExpression parseNumberOfExpression(Node node) throws FormatException {
2720+ Node number = skipWS(node.getFirstChild());
2721+ //The number constant may be omitted.
2722+ //In that case, this parsing returns null.
2723+ Integer numberval = parseNumberConstantExpression(number);
2724+ Node subnode;
2725+ if (numberval != null) {
2726+ //The subexpression comes after the number constant.
2727+ subnode = skipWS(number.getNextSibling());
2728+ } else {
2729+ //The number we read was actually the subexpression.
2730+ subnode = number;
2731+ numberval = 1;
2732+ }
2733+ Vector<ColorExpression> colorexps = new Vector<>();
2734+ while (subnode != null) {
2735+ ColorExpression colorexp = parseColorExpression(subnode);
2736+ colorexps.add(colorexp);
2737+ subnode = skipWS(subnode.getNextSibling());
2738+ }
2739+ return new NumberOfExpression(numberval, colorexps);
2740+
2741+ }
2742+
2743+ private Integer parseNumberConstantExpression(Node node) {
2744+ String name = node.getNodeName();
2745+ if (name.equals("numberconstant")) {
2746+ String value = getAttribute(node, "value").getNodeValue();
2747+ return Integer.valueOf(value);
2748+ } else if (name.equals("subterm")) {
2749+ Node child = skipWS(node.getFirstChild());
2750+ return parseNumberConstantExpression(child);
2751+ } else {
2752+ return null;
2753+ }
2754+ }
2755+
2756+ private ColorExpression parseColorExpression(Node node) throws FormatException {
2757+ String name = node.getNodeName();
2758+ if (name.equals("dotconstant")) {
2759+ return new DotConstantExpression();
2760+ } else if (name.equals("variable")) {
2761+ String varname = getAttribute(node, "refvariable").getNodeValue();
2762+ Variable var = variables.get(varname);
2763+ if(var != null){
2764+ return new VariableExpression(var);
2765+ } else {
2766+ return tupleVarExpressions.get(varname);
2767+ }
2768+ } else if (name.equals("useroperator")) {
2769+ String colorname = getAttribute(node, "declaration").getNodeValue();
2770+ Color color = getColor(colorname);
2771+ return new UserOperatorExpression(color);
2772+ } else if (name.equals("successor")) {
2773+ Node child = skipWS(node.getFirstChild());
2774+ ColorExpression childexp = parseColorExpression(child);
2775+ return new SuccessorExpression(childexp);
2776+ } else if (name.equals("predecessor")) {
2777+ Node child = skipWS(node.getFirstChild());
2778+ ColorExpression childexp = parseColorExpression(child);
2779+ return new PredecessorExpression(childexp);
2780+ } else if(name.equals("all")){
2781+ ColorType ct = parseUserSort(node);
2782+ return new AllExpression(ct);
2783+ } else if (name.equals("tuple")) {
2784+ Vector<ColorExpression> colorexps = new Vector<>();
2785+
2786+ Node child = skipWS(node.getFirstChild());
2787+ while (child != null) {
2788+ ColorExpression colorexp = parseColorExpression(child);
2789+ colorexps.add(colorexp);
2790+ child = skipWS(child.getNextSibling());
2791+ }
2792+ //Sometimes PNML nets have tuples with only 1 color, we just remove the tuple
2793+ if(colorexps.size() < 2){
2794+ return colorexps.get(0);
2795+ }
2796+ return new TupleExpression(colorexps);
2797+ } else if (name.matches("subterm|structure")) {
2798+ Node child = skipWS(node.getFirstChild());
2799+ return parseColorExpression(child);
2800+ } else if (name.equals("finiteintrangeconstant")){
2801+ String value = getAttribute(node, "value").getNodeValue();
2802+ //we assume first child is finiteintrange
2803+ Node intRangeElement = skipWS(node.getFirstChild());
2804+ String start = getAttribute(intRangeElement, "start").getNodeValue();
2805+ String end = getAttribute(intRangeElement, "end").getNodeValue();
2806+ return new UserOperatorExpression(findColorForIntRange(value,start,end));
2807+
2808+ } else {
2809+ throw new FormatException(String.format("Could not parse %s as an color expression\n", name));
2810+ }
2811+ }
2812+
2813+ /// This will select the wrong color if the is overlap in naming, eg for IntegerRangeExpr (1,2,3,4) & (1,2)
2814+ private dk.aau.cs.model.CPN.Color getColor(String colorname) throws FormatException {
2815+ for (ColorType ct : colortypes.values()) {
2816+ for (dk.aau.cs.model.CPN.Color c : ct) {
2817+ if (c.getName().equals(colorname)) {
2818+ return c;
2819+ }
2820+ }
2821+ }
2822+ throw new FormatException(String.format("The color \"%s\" was not declared\n", colorname));
2823+ }
2824+
2825+ public GuardExpression parseGuardExpression(Node node) throws FormatException {
2826+ String name = node.getNodeName();
2827+ if (name.matches("lt|lessthan")) {
2828+ Tuple<ColorExpression, ColorExpression> subexps = parseLRColorExpressions(node);
2829+ return new LessThanExpression(subexps.value1(), subexps.value2());
2830+ } else if (name.matches("gt|greaterthan")) {
2831+ Tuple<ColorExpression, ColorExpression> subexps = parseLRColorExpressions(node);
2832+ return new GreaterThanExpression(subexps.value1(), subexps.value2());
2833+ } else if (name.matches("leq|lessthanorequal")) {
2834+ Tuple<ColorExpression, ColorExpression> subexps = parseLRColorExpressions(node);
2835+ return new LessThanEqExpression(subexps.value1(), subexps.value2());
2836+ } else if (name.matches("geq|greaterthanorequal")) {
2837+ Tuple<ColorExpression, ColorExpression> subexps = parseLRColorExpressions(node);
2838+ return new GreaterThanEqExpression(subexps.value1(), subexps.value2());
2839+ } else if (name.matches("eq|equality")) {
2840+ Tuple<ColorExpression, ColorExpression> subexps = parseLRColorExpressions(node);
2841+ return new EqualityExpression(subexps.value1(), subexps.value2());
2842+ } else if (name.matches("neq|inequality")) {
2843+ Tuple<ColorExpression, ColorExpression> subexps = parseLRColorExpressions(node);
2844+ return new InequalityExpression(subexps.value1(), subexps.value2());
2845+ } else if (name.equals("not")) {
2846+ Node child = skipWS(node.getFirstChild());
2847+ GuardExpression childexp = parseGuardExpression(child);
2848+ return new NotExpression(childexp);
2849+ } else if (name.equals("and")) {
2850+ Tuple<GuardExpression, GuardExpression> subexps = parseLRGuardExpressions(node);
2851+ return new AndExpression(subexps.value1(), subexps.value2());
2852+ } else if (name.equals("or")) {
2853+ Node left = skipWS(node.getFirstChild());
2854+ Node right = skipWS(left.getNextSibling());
2855+ if(right == null){
2856+ return parseGuardExpression(left);
2857+ }
2858+ GuardExpression parentOr = new OrExpression(parseGuardExpression(left), parseGuardExpression(right));
2859+ for (var it = skipWS(right.getNextSibling()); it != null; it = skipWS(it.getNextSibling())){
2860+ parentOr = new OrExpression(parentOr, parseGuardExpression(it));
2861+ }
2862+ return parentOr;
2863+ } else if (name.matches("subterm|structure")) {
2864+ Node child = skipWS(node.getFirstChild());
2865+ return parseGuardExpression(child);
2866+ } else {
2867+ throw new FormatException(String.format("Could not parse %s as a guard expression\n", name));
2868+ }
2869+ }
2870+
2871+ private Tuple<ColorExpression,ColorExpression> parseLRColorExpressions(Node node) throws FormatException {
2872+ Node left = skipWS(node.getFirstChild());
2873+ ColorExpression leftexp = parseColorExpression(left);
2874+ Node right = skipWS(left.getNextSibling());
2875+ ColorExpression rightexp = parseColorExpression(right);
2876+ return new Tuple<>(leftexp, rightexp);
2877+ }
2878+
2879+ private Tuple<GuardExpression,GuardExpression> parseLRGuardExpressions(Node node) throws FormatException {
2880+ Node left = skipWS(node.getFirstChild());
2881+ GuardExpression leftexp = parseGuardExpression(left);
2882+ Node right = skipWS(left.getNextSibling());
2883+ GuardExpression rightexp = parseGuardExpression(right);
2884+ return new Tuple<>(leftexp, rightexp);
2885+ }
2886+
2887+ Color findColorForIntRange(String value, String start, String end) throws FormatException {
2888+ for(var ct : colortypes.values()){
2889+ if(ct.getColors().get(0).getColorName().equals(start) && ct.getColors().get(ct.getColors().size()-1).getColorName().equals(end)){
2890+ for (dk.aau.cs.model.CPN.Color c : ct) {
2891+ if (c.getName().equals(value)) {
2892+ return c;
2893+ }
2894+ }
2895+ }
2896+ }
2897+ throw new FormatException(String.format("The color \"%s\" was not declared in an int range\n", value));
2898+ }
2899+
2900+ public AddExpression constructCleanAddExpression(ColorType ct, ColorMultiset multiset){
2901+ Vector<ArcExpression> coloredTokenList = new Vector<>();
2902+
2903+ for(Color c : ct.getColors()){
2904+ int numberOf = multiset.get(c);
2905+ if(numberOf < 1){
2906+ continue;
2907+ }
2908+ Vector<ColorExpression> v = new Vector<>();
2909+ if(ct.isProductColorType()){
2910+ Vector<ColorExpression> tupleColors = new Vector<>();
2911+ for(Color tupleCol : c.getTuple()){
2912+ UserOperatorExpression color = new UserOperatorExpression(tupleCol);
2913+ tupleColors.add(color);
2914+ }
2915+ TupleExpression tupleExpr = new TupleExpression(tupleColors);
2916+ v.add(tupleExpr);
2917+ } else {
2918+ UserOperatorExpression color = new UserOperatorExpression(c);
2919+ v.add(color);
2920+ }
2921+ NumberOfExpression numOf = new NumberOfExpression(numberOf,v);
2922+ coloredTokenList.add(numOf);
2923+
2924+ }
2925+ return new AddExpression(coloredTokenList);
2926+ }
2927+}
2928
2929=== modified file 'src/main/java/dk/aau/cs/io/LoadedModel.java'
2930--- src/dk/aau/cs/io/LoadedModel.java 2020-08-26 12:29:25 +0000
2931+++ src/main/java/dk/aau/cs/io/LoadedModel.java 2022-07-21 13:30:11 +0000
2932@@ -1,12 +1,11 @@
2933 package dk.aau.cs.io;
2934
2935 import java.util.Collection;
2936-import java.util.List;
2937
2938-import dk.aau.cs.gui.TabContent;
2939+import net.tapaal.gui.petrinet.TAPNLens;
2940 import dk.aau.cs.io.batchProcessing.LoadedBatchProcessingModel;
2941-import pipe.dataLayer.TAPNQuery;
2942-import pipe.dataLayer.Template;
2943+import net.tapaal.gui.petrinet.verification.TAPNQuery;
2944+import net.tapaal.gui.petrinet.Template;
2945 import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;
2946
2947 public class LoadedModel implements LoadedBatchProcessingModel {
2948@@ -15,9 +14,9 @@
2949 private final Collection<TAPNQuery> queries;
2950 private final TimedArcPetriNetNetwork network;
2951 private final Collection<String> messages;
2952- private final TabContent.TAPNLens lens;
2953+ private final TAPNLens lens;
2954
2955- public LoadedModel(TimedArcPetriNetNetwork network, Collection<Template> templates, Collection<TAPNQuery> queries, Collection<String> messages, TabContent.TAPNLens lens){
2956+ public LoadedModel(TimedArcPetriNetNetwork network, Collection<Template> templates, Collection<TAPNQuery> queries, Collection<String> messages, TAPNLens lens){
2957 this.templates = templates;
2958 this.network = network;
2959 this.queries = queries;
2960@@ -30,15 +29,18 @@
2961 public TimedArcPetriNetNetwork network(){ return network; }
2962 public Collection<String> getMessages() { return messages; }
2963
2964- public TabContent.TAPNLens getLens(){
2965+ public TAPNLens getLens(){
2966 if (lens != null) {
2967 return lens;
2968 } else {
2969 boolean isNetTimed = !network().isUntimed();
2970 boolean isNetGame = network().hasUncontrollableTransitions();
2971+ boolean isNetColored = network.isColored();
2972
2973- return new TabContent.TAPNLens(isNetTimed, isNetGame);
2974+ return new TAPNLens(isNetTimed, isNetGame, isNetColored);
2975 }
2976 }
2977-
2978+ public boolean isColored(){
2979+ return lens.isColored();
2980+ }
2981 }
2982\ No newline at end of file
2983
2984=== modified file 'src/main/java/dk/aau/cs/io/LoadedQueries.java'
2985--- src/dk/aau/cs/io/LoadedQueries.java 2020-10-09 07:59:49 +0000
2986+++ src/main/java/dk/aau/cs/io/LoadedQueries.java 2022-07-21 13:30:11 +0000
2987@@ -1,6 +1,5 @@
2988 package dk.aau.cs.io;
2989-import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;
2990-import pipe.dataLayer.TAPNQuery;
2991+import net.tapaal.gui.petrinet.verification.TAPNQuery;
2992 import java.util.Collection;
2993
2994 public class LoadedQueries {
2995
2996=== modified file 'src/main/java/dk/aau/cs/io/ModelLoader.java'
2997--- src/dk/aau/cs/io/ModelLoader.java 2021-08-10 11:37:11 +0000
2998+++ src/main/java/dk/aau/cs/io/ModelLoader.java 2022-07-21 13:30:11 +0000
2999@@ -7,7 +7,7 @@
3000 import java.io.InputStream;
3001
3002 import dk.aau.cs.TCTL.Parsing.ParseException;
3003-import dk.aau.cs.gui.TabContent;
3004+import net.tapaal.gui.petrinet.TAPNLens;
3005
3006 public class ModelLoader {
3007
3008@@ -52,12 +52,12 @@
3009 return oldFormatLoader.load(new ByteArrayInputStream(baos.toByteArray()));
3010
3011 } catch(Throwable e2) {
3012- throw new ParseException(e1.getMessage());
3013+ throw new Exception(e1.getMessage(), e1);
3014 }
3015 }
3016 }
3017
3018- public TabContent.TAPNLens loadLens(InputStream file) throws Exception{
3019+ public TAPNLens loadLens(InputStream file) throws Exception{
3020 TapnXmlLoader newFormatLoader = new TapnXmlLoader();
3021 ByteArrayOutputStream baos = new ByteArrayOutputStream();
3022 byte[] buffer = new byte[1024];
3023
3024=== renamed file 'src/pipe/dataLayer/NetWriter.java' => 'src/main/java/dk/aau/cs/io/NetWriter.java'
3025--- src/pipe/dataLayer/NetWriter.java 2014-05-22 21:26:05 +0000
3026+++ src/main/java/dk/aau/cs/io/NetWriter.java 2022-07-21 13:30:11 +0000
3027@@ -1,4 +1,4 @@
3028-package pipe.dataLayer;
3029+package dk.aau.cs.io;
3030
3031 import java.io.ByteArrayOutputStream;
3032 import java.io.File;
3033@@ -12,7 +12,7 @@
3034 public interface NetWriter {
3035 void savePNML(File file) throws NullPointerException, IOException,
3036 ParserConfigurationException, DOMException,
3037- TransformerConfigurationException, TransformerException;
3038+ TransformerException;
3039
3040- ByteArrayOutputStream savePNML() throws IOException, ParserConfigurationException, DOMException, TransformerConfigurationException, TransformerException;
3041+ ByteArrayOutputStream savePNML() throws IOException, ParserConfigurationException, DOMException, TransformerException;
3042 }
3043
3044=== modified file 'src/main/java/dk/aau/cs/io/PNMLWriter.java'
3045--- src/dk/aau/cs/io/PNMLWriter.java 2020-07-13 13:58:47 +0000
3046+++ src/main/java/dk/aau/cs/io/PNMLWriter.java 2022-07-21 13:30:11 +0000
3047@@ -17,20 +17,20 @@
3048 import javax.xml.transform.dom.DOMSource;
3049 import javax.xml.transform.stream.StreamResult;
3050
3051+import net.tapaal.gui.petrinet.TAPNLens;
3052 import org.w3c.dom.DOMException;
3053 import org.w3c.dom.Document;
3054 import org.w3c.dom.Element;
3055
3056-import pipe.dataLayer.DataLayer;
3057-import pipe.dataLayer.NetWriter;
3058+import pipe.gui.petrinet.dataLayer.DataLayer;
3059 import pipe.gui.MessengerImpl;
3060-import pipe.gui.graphicElements.Arc;
3061-import pipe.gui.graphicElements.Place;
3062-import pipe.gui.graphicElements.Transition;
3063-import pipe.gui.graphicElements.tapn.TimedInhibitorArcComponent;
3064-import pipe.gui.graphicElements.tapn.TimedOutputArcComponent;
3065-import pipe.gui.graphicElements.tapn.TimedPlaceComponent;
3066-import pipe.gui.graphicElements.tapn.TimedTransitionComponent;
3067+import pipe.gui.petrinet.graphicElements.Arc;
3068+import pipe.gui.petrinet.graphicElements.Place;
3069+import pipe.gui.petrinet.graphicElements.Transition;
3070+import pipe.gui.petrinet.graphicElements.tapn.TimedInhibitorArcComponent;
3071+import pipe.gui.petrinet.graphicElements.tapn.TimedOutputArcComponent;
3072+import pipe.gui.petrinet.graphicElements.tapn.TimedPlaceComponent;
3073+import pipe.gui.petrinet.graphicElements.tapn.TimedTransitionComponent;
3074 import dk.aau.cs.model.tapn.TimedArcPetriNet;
3075 import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;
3076 import dk.aau.cs.util.Require;
3077@@ -41,19 +41,21 @@
3078 private final TimedArcPetriNetNetwork network;
3079 private TimedArcPetriNet composedNetwork;
3080 private final HashMap<TimedArcPetriNet, DataLayer> guiModels;
3081+ private final TAPNLens lens;
3082+ private final writeTACPN writeTACPN;
3083
3084- public PNMLWriter(
3085- TimedArcPetriNetNetwork network,
3086- HashMap<TimedArcPetriNet, DataLayer> guiModels) {
3087+ public PNMLWriter(TimedArcPetriNetNetwork network, HashMap<TimedArcPetriNet, DataLayer> guiModels, TAPNLens lens) {
3088 this.network = network;
3089 this.guiModels = guiModels;
3090+ this.lens = lens;
3091+ writeTACPN = new writeTACPN(network);
3092 }
3093
3094- public ByteArrayOutputStream savePNML() throws IOException, ParserConfigurationException, DOMException, TransformerConfigurationException, TransformerException {
3095+ public ByteArrayOutputStream savePNML() throws ParserConfigurationException, DOMException, TransformerException {
3096 Document document = null;
3097 Transformer transformer = null;
3098 ByteArrayOutputStream os = new ByteArrayOutputStream();
3099- TAPNComposer composer = new TAPNComposer(new MessengerImpl(), guiModels, true, true);
3100+ TAPNComposer composer = new TAPNComposer(new MessengerImpl(), guiModels, lens, true, true);
3101 composedNetwork = composer.transformModel(network).value1();
3102
3103 // Build a Petri Net XML Document
3104@@ -69,17 +71,21 @@
3105 pnmlRootNode.appendChild(netNode);
3106 netNode.setAttribute("id", composedNetwork.name());
3107 netNode.setAttribute("type", "http://www.pnml.org/version-2009/grammar/ptnet");
3108-
3109+
3110+ Element nameNode = document.createElement("name"); //Name of the net
3111+ netNode.appendChild(nameNode);
3112+ Element nameText = document.createElement("text");
3113+ nameNode.appendChild(nameText);
3114+ nameText.setTextContent(composedNetwork.name());
3115+
3116+ if(lens.isColored()) {
3117+ writeTACPN.appendDeclarations(document, netNode);
3118+ }
3119+
3120 Element pageNode = document.createElement("page"); //Page node
3121 netNode.appendChild(pageNode);
3122 pageNode.setAttribute("id", "page0");
3123-
3124- Element nameNode = document.createElement("name"); //Name of the net
3125- netNode.appendChild(nameNode);
3126- Element nameText = document.createElement("text");
3127- nameNode.appendChild(nameText);
3128- nameText.setTextContent(composedNetwork.name());
3129-
3130+
3131 appendPlaces(document, composer.getGuiModel(), pageNode);
3132 appendTransitions(document, composer.getGuiModel(), pageNode);
3133 appendArcs(document, composer.getGuiModel(), pageNode);
3134@@ -96,7 +102,7 @@
3135 return os;
3136 }
3137
3138- public void savePNML(File file) throws IOException, ParserConfigurationException, DOMException, TransformerConfigurationException, TransformerException {
3139+ public void savePNML(File file) throws IOException, ParserConfigurationException, DOMException, TransformerException {
3140 Require.that(file != null, "Error: file to save to was null");
3141
3142 try {
3143@@ -130,21 +136,36 @@
3144 private void appendPlaces(Document document, DataLayer guiModel, Element NET) {
3145 Place[] places = guiModel.getPlaces();
3146 for (Place place : places) {
3147- NET.appendChild(createPlaceElement((TimedPlaceComponent) place, guiModel, document));
3148+ if (lens.isColored()){
3149+ NET.appendChild(createColorPlaceElement((TimedPlaceComponent) place, guiModel, document));
3150+ }
3151+ else {
3152+ NET.appendChild(createPlaceElement((TimedPlaceComponent) place, guiModel, document));
3153+ }
3154 }
3155 }
3156
3157 private void appendTransitions(Document document, DataLayer guiModel, Element NET) {
3158 Transition[] transitions = guiModel.getTransitions();
3159 for (Transition transition : transitions) {
3160- NET.appendChild(createTransitionElement((TimedTransitionComponent) transition, document));
3161+ if(lens.isColored()) {
3162+ NET.appendChild(createColoredTransitionElement((TimedTransitionComponent) transition, document));
3163+ }
3164+ else {
3165+ NET.appendChild(createTransitionElement((TimedTransitionComponent) transition, document));
3166+ }
3167 }
3168 }
3169
3170 private void appendArcs(Document document, DataLayer guiModel, Element NET) {
3171 Arc[] arcs = guiModel.getArcs();
3172 for (Arc arc : arcs) {
3173- NET.appendChild(createArcElement(arc, guiModel, document));
3174+ if(lens.isColored()) {
3175+ NET.appendChild(createColoredArcElement(arc,guiModel , document));
3176+ }
3177+ else {
3178+ NET.appendChild(createArcElement(arc, guiModel, document));
3179+ }
3180 }
3181 }
3182
3183@@ -188,6 +209,38 @@
3184 return placeElement;
3185 }
3186
3187+ private Element createColorPlaceElement(TimedPlaceComponent inputPlace, DataLayer guiModel, Document document) {
3188+ Require.that(inputPlace != null, "Error: inputPlace was null");
3189+ Require.that(guiModel != null, "Error: guiModel was null");
3190+ Require.that(document != null, "Error: document was null");
3191+
3192+ Element placeElement = document.createElement("place");
3193+ placeElement.setAttribute("id", (inputPlace.getId() != null ? inputPlace.getId() : inputPlace.getName()));
3194+
3195+
3196+ Element name = document.createElement("name"); //Name
3197+ placeElement.appendChild(name);
3198+ Element nameText = document.createElement("text");
3199+ name.appendChild(nameText);
3200+ nameText.setTextContent(inputPlace.underlyingPlace().name());
3201+ Element nameGraphics = document.createElement("graphics");
3202+ name.appendChild(nameGraphics);
3203+ Element nameOffset = document.createElement("offset");
3204+ nameGraphics.appendChild(nameOffset);
3205+ nameOffset.setAttribute("x", String.valueOf(Math.round(inputPlace.getNameOffsetX())));
3206+ nameOffset.setAttribute("y", String.valueOf(Math.round(inputPlace.getNameOffsetY())));
3207+
3208+ Element graphics = document.createElement("graphics");
3209+ placeElement.appendChild(graphics);
3210+ Element offset = document.createElement("position");
3211+ graphics.appendChild(offset);
3212+ offset.setAttribute("x", String.valueOf(Math.round(inputPlace.getPositionX())));
3213+ offset.setAttribute("y", String.valueOf(Math.round(inputPlace.getPositionY())));
3214+
3215+ writeTACPN.appendColoredPlaceDependencies(inputPlace.underlyingPlace(), document, placeElement);
3216+ return placeElement;
3217+ }
3218+
3219 private Element createTransitionElement(TimedTransitionComponent inputTransition, Document document) {
3220 Require.that(inputTransition != null, "Error: inputTransition was null");
3221 Require.that(document != null, "Error: document was null");
3222@@ -217,6 +270,36 @@
3223 return transitionElement;
3224 }
3225
3226+ private Element createColoredTransitionElement (TimedTransitionComponent inputTransition, Document document) {
3227+ Require.that(inputTransition != null, "Error: inputTransition was null");
3228+ Require.that(document != null, "Error: document was null");
3229+
3230+ Element transitionElement = document.createElement("transition");
3231+ transitionElement.setAttribute("id", (inputTransition.getId() != null ? inputTransition.getId() : "error"));
3232+
3233+ Element name = document.createElement("name"); //Name
3234+ transitionElement.appendChild(name);
3235+ Element nameGraphics = document.createElement("graphics");
3236+ name.appendChild(nameGraphics);
3237+ Element nameOffset = document.createElement("offset");
3238+ nameGraphics.appendChild(nameOffset);
3239+ nameOffset.setAttribute("x", String.valueOf(Math.round(inputTransition.getNameOffsetX())));
3240+ nameOffset.setAttribute("y", String.valueOf(Math.round(inputTransition.getNameOffsetY())));
3241+ Element nameText = document.createElement("text");
3242+ name.appendChild(nameText);
3243+ nameText.setTextContent(inputTransition.underlyingTransition().name());
3244+
3245+ Element graphics = document.createElement("graphics");
3246+ transitionElement.appendChild(graphics);
3247+ Element offset = document.createElement("position");
3248+ graphics.appendChild(offset);
3249+ offset.setAttribute("x", String.valueOf(Math.round(inputTransition.getPositionX())));
3250+ offset.setAttribute("y", String.valueOf(Math.round(inputTransition.getPositionY())));
3251+
3252+ writeTACPN.appendColoredTransitionDependencies(inputTransition.underlyingTransition(), document, transitionElement);
3253+ return transitionElement;
3254+ }
3255+
3256 private Element createArcElement(Arc arc, DataLayer guiModel, Document document) {
3257 Require.that(arc != null, "Error: inputArc was null");
3258 Require.that(guiModel != null, "Error: guiModel was null");
3259@@ -258,6 +341,47 @@
3260
3261 return arcElement;
3262 }
3263+
3264+ private Element createColoredArcElement(Arc arc, DataLayer guiModel, Document document) {
3265+ Require.that(arc != null, "Error: inputArc was null");
3266+ Require.that(guiModel != null, "Error: guiModel was null");
3267+ Require.that(document != null, "Error: document was null");
3268+
3269+ Element arcElement = document.createElement("arc");
3270+ arcElement.setAttribute("id", (arc.getId() != null ? arc.getId() : "error"));
3271+ arcElement.setAttribute("source", (arc.getSource().getId() != null ? arc.getSource().getId() : ""));
3272+ arcElement.setAttribute("target", (arc.getTarget().getId() != null ? arc.getTarget().getId() : ""));
3273+
3274+ writeTACPN.appendColoredArcsDependencies(arc, guiModel, document, arcElement);
3275+
3276+ if (arc instanceof TimedOutputArcComponent && arc.getWeight().value() > 1 ) {
3277+ Element inscription = document.createElement("inscription");
3278+ arcElement.appendChild(inscription);
3279+ Element text = document.createElement("text");
3280+ inscription.appendChild(text);
3281+ text.setTextContent(arc.getWeight().nameForSaving(false)+"");
3282+ }
3283+
3284+ if(arc instanceof TimedInhibitorArcComponent){
3285+ arcElement.setAttribute("type", "inhibitor");
3286+ } else {
3287+ arcElement.setAttribute("type", "normal");
3288+ }
3289+
3290+ //ArcPath
3291+ int arcPoints = arc.getArcPath().getArcPathDetails().length;
3292+ if (arcPoints > 2) {
3293+ Element graphics = document.createElement("graphics");
3294+ arcElement.appendChild(graphics);
3295+
3296+ String[][] point = arc.getArcPath().getArcPathDetails();
3297+ for (int j = 1; j < arcPoints-1; j++) { // Do not write the first and last point
3298+ graphics.appendChild(createArcPoint(point[j][0],
3299+ point[j][1], point[j][2], document, j));
3300+ }
3301+ }
3302+ return arcElement;
3303+ }
3304
3305 private Element createArcPoint(String x, String y, String type, Document document, int id) {
3306 Require.that(document != null, "Error: document was null");
3307
3308=== modified file 'src/main/java/dk/aau/cs/io/PNMLoader.java'
3309--- src/dk/aau/cs/io/PNMLoader.java 2020-08-26 12:29:25 +0000
3310+++ src/main/java/dk/aau/cs/io/PNMLoader.java 2022-07-21 13:30:11 +0000
3311@@ -6,28 +6,25 @@
3312 import java.io.FileNotFoundException;
3313 import java.io.IOException;
3314 import java.io.InputStream;
3315-import java.util.ArrayList;
3316-import java.util.Arrays;
3317-import java.util.HashMap;
3318-import java.util.HashSet;
3319+import java.util.*;
3320
3321 import javax.xml.parsers.DocumentBuilder;
3322 import javax.xml.parsers.DocumentBuilderFactory;
3323 import javax.xml.parsers.ParserConfigurationException;
3324
3325-import dk.aau.cs.gui.TabContent;
3326+import net.tapaal.gui.petrinet.TAPNLens;
3327+import dk.aau.cs.model.CPN.*;
3328+import dk.aau.cs.model.CPN.Expressions.*;
3329 import org.w3c.dom.Document;
3330 import org.w3c.dom.Element;
3331 import org.w3c.dom.Node;
3332 import org.w3c.dom.NodeList;
3333 import org.xml.sax.SAXException;
3334
3335-import dk.aau.cs.gui.NameGenerator;
3336-import dk.aau.cs.model.tapn.Bound;
3337+import net.tapaal.gui.petrinet.NameGenerator;
3338 import dk.aau.cs.model.tapn.IntWeight;
3339 import dk.aau.cs.model.tapn.LocalTimedPlace;
3340 import dk.aau.cs.model.tapn.TimeInterval;
3341-import dk.aau.cs.model.tapn.TimeInvariant;
3342 import dk.aau.cs.model.tapn.TimedArcPetriNet;
3343 import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;
3344 import dk.aau.cs.model.tapn.TimedInhibitorArc;
3345@@ -38,463 +35,534 @@
3346 import dk.aau.cs.model.tapn.TimedTransition;
3347 import dk.aau.cs.util.FormatException;
3348 import dk.aau.cs.util.Require;
3349-import pipe.dataLayer.DataLayer;
3350-import pipe.dataLayer.TAPNQuery;
3351-import pipe.dataLayer.Template;
3352-import pipe.gui.Pipe;
3353-import pipe.gui.Zoomer;
3354-import pipe.gui.graphicElements.Arc;
3355-import pipe.gui.graphicElements.PlaceTransitionObject;
3356-import pipe.gui.graphicElements.tapn.TimedInhibitorArcComponent;
3357-import pipe.gui.graphicElements.tapn.TimedInputArcComponent;
3358-import pipe.gui.graphicElements.tapn.TimedOutputArcComponent;
3359-import pipe.gui.graphicElements.tapn.TimedPlaceComponent;
3360-import pipe.gui.graphicElements.tapn.TimedTransitionComponent;
3361+import pipe.gui.petrinet.dataLayer.DataLayer;
3362+import net.tapaal.gui.petrinet.verification.TAPNQuery;
3363+import net.tapaal.gui.petrinet.Template;
3364+import pipe.gui.Constants;
3365+import pipe.gui.canvas.Zoomer;
3366+import pipe.gui.petrinet.graphicElements.Arc;
3367+import pipe.gui.petrinet.graphicElements.PlaceTransitionObject;
3368+import pipe.gui.petrinet.graphicElements.tapn.TimedInhibitorArcComponent;
3369+import pipe.gui.petrinet.graphicElements.tapn.TimedInputArcComponent;
3370+import pipe.gui.petrinet.graphicElements.tapn.TimedOutputArcComponent;
3371+import pipe.gui.petrinet.graphicElements.tapn.TimedPlaceComponent;
3372+import pipe.gui.petrinet.graphicElements.tapn.TimedTransitionComponent;
3373
3374 public class PNMLoader {
3375-
3376- private final TabContent.TAPNLens lens = TabContent.TAPNLens.Default;
3377+ private TAPNLens lens;
3378
3379 enum GraphicsType { Position, Offset }
3380
3381- private final NameGenerator nameGenerator = new NameGenerator();
3382- private final IdResolver idResolver = new IdResolver();
3383- private final HashSet<String> arcs = new HashSet<String>();
3384- private final HashMap<String, TimedPlace> places = new HashMap<String, TimedPlace>();
3385- private final HashMap<String, TimedTransition> transitions = new HashMap<String, TimedTransition>();
3386-
3387- //If the net is too big, do not make the graphics
3388- private int netSize = 0;
3389- private final int maxNetSize = 4000;
3390- private boolean hasPositionalInfo = false;
3391-
3392- public PNMLoader() {
3393- }
3394-
3395- public LoadedModel load(File file) throws FormatException{
3396- try{
3397- return load(new FileInputStream(file));
3398- } catch (FileNotFoundException e){
3399- return null;
3400- } catch (NullPointerException e){
3401- throw new FormatException("the PNML file cannot be parsed due to syntax errors");
3402- }
3403- }
3404-
3405- public LoadedModel load(InputStream file) throws FormatException{
3406- Document doc = loadDocument(file);
3407-
3408- return parse(doc);
3409- }
3410-
3411- private Document loadDocument(InputStream file) {
3412- try {
3413- DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
3414- return builder.parse(file);
3415- } catch (ParserConfigurationException | IOException | SAXException e) {
3416- return null;
3417- }
3418- }
3419-
3420- private LoadedModel parse(Document doc) throws FormatException {
3421- idResolver.clear();
3422-
3423- TimedArcPetriNetNetwork network = new TimedArcPetriNetNetwork();
3424-
3425- //We assume there is only one net per file (this is what we call a TAPN Network)
3426- Node pnmlElement = doc.getElementsByTagName("pnml").item(0);
3427- Node netNode = getFirstDirectChild(pnmlElement, "net");
3428-
3429- String name = getTAPNName(netNode);
3430-
3431- TimedArcPetriNet tapn = new TimedArcPetriNet(name);
3432- tapn.setCheckNames(false);
3433- network.add(tapn);
3434- nameGenerator.add(tapn);
3435-
3436- //We assume there is only one page pr. file (this is what we call a net)
3437- Template template = new Template(tapn, new DataLayer(), new Zoomer());
3438-
3439- parseTimedArcPetriNet(netNode, tapn, template);
3440- template.setHasPositionalInfo(hasPositionalInfo);
3441-
3442- network.setPaintNet(isNetDrawable());
3443- tapn.setCheckNames(true);
3444- return new LoadedModel(network, Arrays.asList(template), new ArrayList<TAPNQuery>(), new ArrayList<>(), null);
3445- }
3446-
3447- private String getTAPNName(Node netNode) {
3448- if(!(netNode instanceof Element)){
3449- return nameGenerator.getNewTemplateName();
3450- }
3451- String result = null;
3452-
3453- Node name = getFirstDirectChild(netNode, "name");
3454- if(name != null){
3455- result = getFirstDirectChild(name, "text").getTextContent();
3456- }
3457-
3458- if(name == null || name.equals("")){
3459- return nameGenerator.getNewTemplateName();
3460- }
3461-
3462- return NamePurifier.purify(result);
3463- }
3464-
3465- private void parseTimedArcPetriNet(Node netNode, TimedArcPetriNet tapn, Template template) throws FormatException {
3466- //We assume there is only one page pr. file (this is what we call a net)
3467- Node node = getFirstDirectChild(netNode, "page").getFirstChild();
3468- Node first = node;
3469-
3470- //Calculate netsize
3471- while(node != null){
3472- netSize += 1;
3473- node = node.getNextSibling();
3474- }
3475-
3476- node = first;
3477- //We parse the places and transitions first
3478- while(node != null){
3479- String tag = node.getNodeName();
3480- if(tag.equals("place")){
3481- parsePlace(node, tapn, template);
3482- } else if(tag.equals("transition")){
3483- parseTransition(node, tapn, template);
3484- }
3485- node = node.getNextSibling();
3486- }
3487-
3488- //We parse the transitions last, as we need the places and transitions it refers to
3489- node = first;
3490- while(node != null){
3491- String tag = node.getNodeName();
3492- if(tag.equals("arc")){
3493- parseArc(node, template);
3494- }
3495- node = node.getNextSibling();
3496- }
3497- }
3498-
3499- private void parsePlace(Node node, TimedArcPetriNet tapn, Template template) {
3500- if(!(node instanceof Element)){
3501- return;
3502- }
3503-
3504- Name name = parseName(getFirstDirectChild(node, "name"));
3505- if(name == null){
3506- name = new Name(nameGenerator.getNewPlaceName(template.model()));
3507- }
3508- Point position = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Position);
3509- String id = NamePurifier.purify(((Element) node).getAttribute("id"));
3510- InitialMarking marking = parseMarking(getFirstDirectChild(node, "initialMarking"));
3511-
3512- TimedPlace place = new LocalTimedPlace(id, new TimeInvariant(false, new Bound.InfBound()));
3513- Require.that(places.put(id, place) == null && !transitions.containsKey(id),
3514- "The name: " + id + ", was already used");
3515- tapn.add(place);
3516-
3517- if(isNetDrawable()){
3518- //We parse the id as both the name and id as in tapaal name = id, and name/id has to be unique
3519- TimedPlaceComponent placeComponent = new TimedPlaceComponent(position.x, position.y, id, name.point.x, name.point.y, lens);
3520- placeComponent.setUnderlyingPlace(place);
3521- template.guiModel().addPetriNetObject(placeComponent);
3522- }
3523-
3524- idResolver.add(tapn.name(), id, id);
3525-
3526- for (int i = 0; i < marking.marking; i++) {
3527- tapn.parentNetwork().marking().add(new TimedToken(place));
3528- }
3529- }
3530-
3531- private InitialMarking parseMarking(Node node) {
3532- if(!(node instanceof Element)){
3533- return new InitialMarking();
3534- }
3535-
3536- Point offset = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Offset);
3537-
3538- int marking = Integer.parseInt(getFirstDirectChild(node, "text").getTextContent());
3539-
3540- return new InitialMarking(marking, offset);
3541- }
3542-
3543- private void parseTransition(Node node, TimedArcPetriNet tapn, Template template) {
3544- if(!(node instanceof Element)){
3545- return;
3546- }
3547-
3548- Point position = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Position);
3549- Name name = parseName(getFirstDirectChild(node, "name"));
3550- if(name == null){
3551- name = new Name(nameGenerator.getNewTransitionName(template.model()));
3552- }
3553- String id = NamePurifier.purify(((Element) node).getAttribute("id"));
3554-
3555- TimedTransition transition = new TimedTransition(id);
3556- Require.that(transitions.put(id, transition) == null && !places.containsKey(id),
3557- "The id: " + id + ", was already used");
3558- tapn.add(transition);
3559-
3560- if(isNetDrawable()){
3561- TimedTransitionComponent transitionComponent =
3562- //We parse the id as both the name and id as in tapaal name = id, and name/id has to be unique
3563- new TimedTransitionComponent(position.x, position.y, id, name.point.x, name.point.y, true, false, 0, 0, lens);
3564- transitionComponent.setUnderlyingTransition(transition);
3565- template.guiModel().addPetriNetObject(transitionComponent);
3566- }
3567- idResolver.add(tapn.name(), id, id);
3568- }
3569-
3570- private void parseArc(Node node, Template template) throws FormatException {
3571- if(!(node instanceof Element)){
3572- return;
3573- }
3574-
3575- Element element = (Element) node;
3576-
3577- String id = element.getAttribute("id");
3578- String sourceId = NamePurifier.purify(element.getAttribute("source"));
3579- String targetId = NamePurifier.purify(element.getAttribute("target"));
3580- String type = element.getAttribute("type");
3581-
3582- String sourceName = idResolver.get(template.model().name(), sourceId);
3583- String targetName = idResolver.get(template.model().name(), targetId);
3584-
3585- TimedPlace sourcePlace = places.get(sourceName);
3586- TimedPlace targetPlace = places.get(targetName);
3587-
3588- TimedTransition sourceTransition = transitions.get(sourceName);
3589- TimedTransition targetTransition = transitions.get(targetName);
3590-
3591- PlaceTransitionObject source = template.guiModel().getPlaceTransitionObject(sourceName);
3592- PlaceTransitionObject target = template.guiModel().getPlaceTransitionObject(targetName);
3593-
3594- //Inscription
3595- int weight = 1;
3596- Node inscription = getFirstDirectChild(node, "inscription");
3597- if(inscription != null){
3598- Node text = getFirstDirectChild(inscription, "text");
3599- if(text != null){
3600- String weightString = text.getTextContent().trim();
3601+ private final NameGenerator nameGenerator = new NameGenerator();
3602+ private final IdResolver idResolver = new IdResolver();
3603+ private final HashSet<String> arcs = new HashSet<String>();
3604+ private final HashMap<String, TimedPlace> places = new HashMap<String, TimedPlace>();
3605+ private final HashMap<String, TimedTransition> transitions = new HashMap<String, TimedTransition>();
3606+ private final HashMap<String, ColorType> colortypes = new HashMap<String, ColorType>();
3607+ private final HashMap<String, Variable> variables = new HashMap<String, Variable>();
3608+
3609+ //If the net is too big, do not make the graphics
3610+ private int netSize = 0;
3611+ private final int maxNetSize = 4000;
3612+ private boolean hasPositionalInfo = false;
3613+ private final LoadTACPN loadTACPN;
3614+
3615+ public PNMLoader() {
3616+ this.lens = TAPNLens.Default;
3617+ loadTACPN = new LoadTACPN();
3618+ }
3619+
3620+ public LoadedModel load(File file) throws FormatException{
3621+ try{
3622+ return load(new FileInputStream(file));
3623+ } catch (FileNotFoundException e){
3624+ return null;
3625+ } catch (NullPointerException e){
3626+ throw new FormatException("the PNML file cannot be parsed due to syntax errors", e);
3627+ }
3628+ }
3629+
3630+ public LoadedModel load(InputStream file) throws FormatException{
3631+ Document doc = loadDocument(file);
3632+
3633+ return parse(doc);
3634+ }
3635+
3636+ private Document loadDocument(InputStream file) {
3637+ try {
3638+ DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
3639+ return builder.parse(file);
3640+ } catch (ParserConfigurationException | IOException | SAXException e) {
3641+ return null;
3642+ }
3643+ }
3644+
3645+ private LoadedModel parse(Document doc) throws FormatException {
3646+ idResolver.clear();
3647+
3648+ TimedArcPetriNetNetwork network = new TimedArcPetriNetNetwork();
3649+
3650+ //We assume there is only one net per file (this is what we call a TAPN Network)
3651+ Node pnmlElement = doc.getElementsByTagName("pnml").item(0);
3652+ Node netNode = getFirstDirectChild(pnmlElement, "net");
3653+
3654+ lens = new TAPNLens(false, false, getFirstDirectChild(netNode, "declaration") != null);
3655+
3656+ String name = getTAPNName(netNode);
3657+
3658+ TimedArcPetriNet tapn = new TimedArcPetriNet(name);
3659+ tapn.setCheckNames(false);
3660+ network.add(tapn);
3661+ nameGenerator.add(tapn);
3662+
3663+ //We assume there is only one page pr. file (this is what we call a net)
3664+ Template template = new Template(tapn, new DataLayer(), new Zoomer());
3665+
3666+ parseTimedArcPetriNet(netNode, tapn, template, network);
3667+ template.setHasPositionalInfo(hasPositionalInfo);
3668+
3669+ network.setPaintNet(isNetDrawable());
3670+ tapn.setCheckNames(true);
3671+
3672+ return new LoadedModel(network, List.of(template), new ArrayList<TAPNQuery>(), new ArrayList<>(), lens);
3673+ }
3674+
3675+ private String getTAPNName(Node netNode) {
3676+ if(!(netNode instanceof Element)){
3677+ return nameGenerator.getNewTemplateName();
3678+ }
3679+ String result = null;
3680+
3681+ Node name = getFirstDirectChild(netNode, "name");
3682+ if(name != null){
3683+ result = getFirstDirectChild(name, "text").getTextContent();
3684+ }
3685+
3686+ if(name == null || name.equals("")){
3687+ return nameGenerator.getNewTemplateName();
3688+ }
3689+
3690+ return NamePurifier.purify(result);
3691+ }
3692+
3693+ private void parseTimedArcPetriNet(Node netNode, TimedArcPetriNet tapn, Template template, TimedArcPetriNetNetwork network) throws FormatException {
3694+ if (lens.isColored()) {
3695+ Node declarations = getFirstDirectChild(netNode, "declaration");
3696+ loadTACPN.parseDeclarations(declarations, network);
3697+ }
3698+
3699+ //We assume there is only one page pr. file (this is what we call a net)
3700+ Node node = getFirstDirectChild(netNode, "page").getFirstChild();
3701+ Node first = node;
3702+
3703+ //Calculate netsize
3704+ while(node != null){
3705+ netSize += 1;
3706+ node = node.getNextSibling();
3707+ }
3708+
3709+ node = first;
3710+ //We parse the places and transitions first
3711+ while(node != null){
3712+ String tag = node.getNodeName();
3713+ if(tag.equals("place")){
3714+ parsePlace(node, tapn, template);
3715+ } else if(tag.equals("transition")){
3716+ parseTransition(node, tapn, template);
3717+ }
3718+ node = node.getNextSibling();
3719+ }
3720+ //We parse the transitions last, as we need the places and transitions it refers to
3721+ node = first;
3722+ while(node != null){
3723+ String tag = node.getNodeName();
3724+ if(tag.equals("arc")){
3725+ parseArc(node, template);
3726+ }
3727+ node = node.getNextSibling();
3728+ }
3729+ }
3730+ private void parsePlace(Node node, TimedArcPetriNet tapn, Template template) throws FormatException {
3731+ if (!(node instanceof Element)) {
3732+ return;
3733+ }
3734+
3735+ Name name = parseName(getFirstDirectChild(node, "name"));
3736+ if (name == null) {
3737+ name = new Name(nameGenerator.getNewPlaceName(template.model()));
3738+ }
3739+ Point position = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Position);
3740+ String id = NamePurifier.purify(((Element) node).getAttribute("id"));
3741+ ArcExpression colorMarking = null;
3742+ Point markingOffset = null;
3743+ TimedPlace place;
3744+ InitialMarking marking = parseMarking(getFirstDirectChild(node, "initialMarking"));
3745+ ColorType colorType = ColorType.COLORTYPE_DOT;
3746+ Node typeNode = getFirstDirectChild(node, "type");
3747+ if (typeNode != null) {
3748+ try {
3749+ colorType = loadTACPN.parseUserSort(typeNode);
3750+ } catch (FormatException e) {
3751+ e.printStackTrace();
3752+ }
3753+ }
3754+ Node markingNode = getFirstDirectChild(node, "hlinitialMarking");
3755+ if (markingNode instanceof Element) {
3756+ try {
3757+ colorMarking = loadTACPN.parseArcExpression(((Element) markingNode).getElementsByTagName("structure").item(0));
3758+ } catch (FormatException e) {
3759+ e.printStackTrace();
3760+ }
3761+ }
3762+ place = new LocalTimedPlace(id, colorType);
3763+
3764+ Require.that(places.put(id, place) == null && !transitions.containsKey(id),
3765+ "The name: " + id + ", was already used");
3766+ tapn.add(place);
3767+
3768+ if (isNetDrawable()) {
3769+ //We parse the id as both the name and id as in tapaal name = id, and name/id has to be unique
3770+ TimedPlaceComponent placeComponent;
3771+ placeComponent = new TimedPlaceComponent(position.x, position.y, id, name.point.x, name.point.y, lens);
3772+ placeComponent.setUnderlyingPlace(place);
3773+ template.guiModel().addPetriNetObject(placeComponent);
3774+ }
3775+
3776+ idResolver.add(tapn.name(), id, id);
3777+
3778+
3779+ if (colorMarking != null) {
3780+ ExpressionContext context = new ExpressionContext(new HashMap<String, Color>(), loadTACPN.getColortypes());
3781+ ColorMultiset cm = colorMarking.eval(context);
3782+ place.setTokenExpression(loadTACPN.constructCleanAddExpression(colorType,cm));
3783+ for (TimedToken ct : cm.getTokens(place)) {
3784+ tapn.parentNetwork().marking().add(ct);
3785+ }
3786+
3787+ } else {
3788+ for (int i = 0; i < marking.marking; i++) {
3789+ tapn.parentNetwork().marking().add(new TimedToken(place, ColorType.COLORTYPE_DOT.getFirstColor()));
3790+ }
3791+ if (marking.marking > 1) {
3792+ Vector<ColorExpression> v = new Vector<>();
3793+ v.add(new DotConstantExpression());
3794+ Vector<ArcExpression> numbOfExpression = new Vector<>();
3795+ numbOfExpression.add(new NumberOfExpression(marking.marking, v));
3796+ place.setTokenExpression(new AddExpression(numbOfExpression));
3797+ }
3798+ }
3799+ }
3800+
3801+
3802+ private static Node skipWS(Node node) {
3803+ if (node != null && !(node instanceof Element)) {
3804+ return skipWS(node.getNextSibling());
3805+ } else {
3806+ return node;
3807+ }
3808+ }
3809+
3810+ private static Node getAttribute(Node node, String attribute) {
3811+ return node.getAttributes().getNamedItem(attribute);
3812+ }
3813+
3814+
3815+ private InitialMarking parseMarking(Node node) {
3816+ if(!(node instanceof Element)){
3817+ return new InitialMarking();
3818+ }
3819+
3820+ Point offset = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Offset);
3821+
3822+ int marking = Integer.parseInt(getFirstDirectChild(node, "text").getTextContent());
3823+
3824+ return new InitialMarking(marking, offset);
3825+ }
3826+
3827+ private void parseTransition(Node node, TimedArcPetriNet tapn, Template template) throws FormatException {
3828+ if(!(node instanceof Element)){
3829+ return;
3830+ }
3831+
3832+ Point position = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Position);
3833+ Name name = parseName(getFirstDirectChild(node, "name"));
3834+ if(name == null){
3835+ name = new Name(nameGenerator.getNewTransitionName(template.model()));
3836+ }
3837+ String id = NamePurifier.purify(((Element) node).getAttribute("id"));
3838+
3839+ GuardExpression guardExpression = null;
3840+ Node conditionNode = getFirstDirectChild(node, "condition");
3841+ if (conditionNode != null) {
3842+ guardExpression = loadTACPN.parseGuardExpression(getFirstDirectChild(conditionNode, "structure"));
3843+ }
3844+
3845+ TimedTransition transition = new TimedTransition(id, guardExpression);
3846+ Require.that(transitions.put(id, transition) == null && !places.containsKey(id),
3847+ "The id: " + id + ", was already used");
3848+ tapn.add(transition);
3849+
3850+ if(isNetDrawable()){
3851+ TimedTransitionComponent transitionComponent =
3852+ //We parse the id as both the name and id as in tapaal name = id, and name/id has to be unique
3853+ new TimedTransitionComponent(position.x, position.y, id, name.point.x, name.point.y, 0, lens);
3854+ transitionComponent.setUnderlyingTransition(transition);
3855+ template.guiModel().addPetriNetObject(transitionComponent);
3856+ }
3857+ idResolver.add(tapn.name(), id, id);
3858+ }
3859+
3860+ private void parseArc(Node node, Template template) throws FormatException {
3861+ if(!(node instanceof Element)){
3862+ return;
3863+ }
3864+
3865+ Element element = (Element) node;
3866+
3867+ String id = element.getAttribute("id");
3868+ String sourceId = NamePurifier.purify(element.getAttribute("source"));
3869+ String targetId = NamePurifier.purify(element.getAttribute("target"));
3870+ String type = element.getAttribute("type");
3871+
3872+ String sourceName = idResolver.get(template.model().name(), sourceId);
3873+ String targetName = idResolver.get(template.model().name(), targetId);
3874+
3875+ TimedPlace sourcePlace = places.get(sourceName);
3876+ TimedPlace targetPlace = places.get(targetName);
3877+
3878+ TimedTransition sourceTransition = transitions.get(sourceName);
3879+ TimedTransition targetTransition = transitions.get(targetName);
3880+
3881+ PlaceTransitionObject source = template.guiModel().getPlaceTransitionObject(sourceName);
3882+ PlaceTransitionObject target = template.guiModel().getPlaceTransitionObject(targetName);
3883+
3884+ //Inscription
3885+ int weight = 1;
3886+ Node inscription = getFirstDirectChild(node, "inscription");
3887+ if(inscription != null){
3888+ Node text = getFirstDirectChild(inscription, "text");
3889+ if(text != null){
3890+ String weightString = text.getTextContent().trim();
3891 try {
3892 weight = Integer.parseInt(weightString);
3893 } catch (NumberFormatException ignored) {} //Default values is 1
3894- }
3895- }
3896-
3897- int _startx = 0, _starty = 0, _endx = 0, _endy = 0;
3898-
3899- if(isNetDrawable()){
3900- // add the insets and offset
3901- _startx = source.getX() + source.centreOffsetLeft();
3902- _starty = source.getY() + source.centreOffsetTop();
3903-
3904- _endx = target.getX() + target.centreOffsetLeft();
3905- _endy = target.getY() + target.centreOffsetTop();
3906- }
3907-
3908- Arc tempArc;
3909-
3910- if(type != null && type.equals("inhibitor")) {
3911- tempArc = parseAndAddTimedInhibitorArc(id, sourcePlace, targetTransition, source, target, weight, _endx, _endy, template);
3912- } else if(sourcePlace != null && targetTransition != null) {
3913- tempArc = parseInputArc(id, sourcePlace, targetTransition, source, target, weight, _endx, _endy, template);
3914- } else if(sourceTransition != null && targetPlace != null) {
3915- tempArc = parseOutputArc(id, sourceTransition, targetPlace, source, target, weight, _endx, _endy, template);
3916- } else {
3917- throw new FormatException("Arcs must be only between places and transitions");
3918- }
3919-
3920- if(isNetDrawable()) parseArcPath(element, tempArc);
3921- }
3922-
3923- private void parseArcPath(Element arc, Arc tempArc) {
3924- Element element = (Element) getFirstDirectChild(arc, "graphics");
3925- if(element == null) return;
3926- NodeList nodelist = element.getElementsByTagName("position");
3927- if (nodelist.getLength() > 0) {
3928- for (int i = 0; i < nodelist.getLength(); i++) {
3929- Node node = nodelist.item(i);
3930- if (node instanceof Element) {
3931- Element position = (Element) node;
3932- if ("position".equals(position.getNodeName())) {
3933- String arcTempX = position.getAttribute("x");
3934- String arcTempY = position.getAttribute("y");
3935-
3936- double arcPointX = Double.parseDouble(arcTempX);
3937+ }
3938+ }
3939+
3940+ int _startx = 0, _starty = 0, _endx = 0, _endy = 0;
3941+
3942+ if(isNetDrawable()){
3943+ // add the insets and offset
3944+ _startx = source.getX() + source.centreOffsetLeft();
3945+ _starty = source.getY() + source.centreOffsetTop();
3946+
3947+ _endx = target.getX() + target.centreOffsetLeft();
3948+ _endy = target.getY() + target.centreOffsetTop();
3949+ }
3950+
3951+ Arc tempArc;
3952+ ArcExpression arcExpression = null;
3953+ Node hlInscriptionNode = getFirstDirectChild(node, "hlinscription");
3954+ if (hlInscriptionNode != null) {
3955+ arcExpression = loadTACPN.parseArcExpression(getFirstDirectChild(hlInscriptionNode, "structure"));
3956+ }
3957+
3958+ if(type != null && type.equals("inhibitor")) {
3959+ tempArc = parseAndAddTimedInhibitorArc(id, sourcePlace, targetTransition, source, target, weight, arcExpression, _endx, _endy, template);
3960+ } else if(sourcePlace != null && targetTransition != null) {
3961+ tempArc = parseInputArc(id, sourcePlace, targetTransition, source, target, weight, arcExpression, _endx, _endy, template);
3962+ } else if(sourceTransition != null && targetPlace != null) {
3963+ tempArc = parseOutputArc(id, sourceTransition, targetPlace, source, target, weight, arcExpression, _endx, _endy, template);
3964+ } else {
3965+ throw new FormatException("Arcs must be only between places and transitions");
3966+ }
3967+
3968+ if(isNetDrawable()) parseArcPath(element, tempArc);
3969+ }
3970+
3971+ private void parseArcPath(Element arc, Arc tempArc) {
3972+ Element element = (Element) getFirstDirectChild(arc, "graphics");
3973+ if(element == null) return;
3974+ NodeList nodelist = element.getElementsByTagName("position");
3975+ if (nodelist.getLength() > 0) {
3976+ for (int i = 0; i < nodelist.getLength(); i++) {
3977+ Node node = nodelist.item(i);
3978+ if (node instanceof Element) {
3979+ Element position = (Element) node;
3980+ if ("position".equals(position.getNodeName())) {
3981+ String arcTempX = position.getAttribute("x");
3982+ String arcTempY = position.getAttribute("y");
3983+
3984+ double arcPointX = Double.parseDouble(arcTempX);
3985 double arcPointY = Double.parseDouble(arcTempY);
3986- arcPointX += Pipe.ARC_CONTROL_POINT_CONSTANT + 1;
3987- arcPointY += Pipe.ARC_CONTROL_POINT_CONSTANT + 1;
3988-
3989- //We add the point at i+1 as the starting and end points of
3990- //the arc is already in the path as point number 0 and 1
3991- tempArc.getArcPath().addPoint(i+1,arcPointX, arcPointY, false);
3992- }
3993- }
3994- }
3995- }
3996- }
3997-
3998- private Name parseName(Node node){
3999- if(!(node instanceof Element)){
4000- return null;
4001- }
4002- Point offset = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Offset);
4003-
4004- String name = getFirstDirectChild(node, "text").getTextContent();
4005- if(name == null || name.equals("")){
4006- return null;
4007- }
4008-
4009- name = NamePurifier.purify(name);
4010- return new Name(name, offset);
4011- }
4012-
4013- private Point parseGraphics(Node node, GraphicsType type){
4014- if(!(node instanceof Element)){
4015- if(type == GraphicsType.Offset)
4016- return new Point(0, -10);
4017- else
4018- return new Point(100, 100);
4019- }
4020-
4021- hasPositionalInfo = true;
4022- Element offset = (Element)getFirstDirectChild(node, type == GraphicsType.Offset ? "offset" : "position");
4023-
4024- String x = offset.getAttribute("x");
4025- String y = offset.getAttribute("y");
4026-
4027- int xd = Math.round(Float.parseFloat(x));
4028- int yd = Math.round(Float.parseFloat(y));
4029-
4030- return new Point(xd, yd);
4031- }
4032-
4033- private static class Name{
4034- String name;
4035- Point point;
4036-
4037- public Name(String newPlaceName) {
4038- this(newPlaceName, new Point());
4039- }
4040-
4041- public Name(String name, Point p) {
4042- this.name = name;
4043- this.point = p;
4044- }
4045-
4046- @Override
4047- public String toString() {
4048- return name + ";" + point;
4049- }
4050- }
4051-
4052- private static class InitialMarking{
4053- int marking;
4054- Point point;
4055-
4056- public InitialMarking() {
4057- this(0, new Point());
4058- }
4059-
4060-
4061- public InitialMarking(int marking, Point p) {
4062- this.marking = marking;
4063- this.point = p;
4064- }
4065-
4066- @Override
4067- public String toString() {
4068- return marking + ";" + point;
4069- }
4070- }
4071-
4072- private TimedInputArcComponent parseInputArc(String arcId, TimedPlace place, TimedTransition transition, PlaceTransitionObject source,
4073- PlaceTransitionObject target, int weight, int _endx,
4074+ arcPointX += Constants.ARC_CONTROL_POINT_CONSTANT + 1;
4075+ arcPointY += Constants.ARC_CONTROL_POINT_CONSTANT + 1;
4076+
4077+ //We add the point at i+1 as the starting and end points of
4078+ //the arc is already in the path as point number 0 and 1
4079+ tempArc.getArcPath().addPoint(i+1,arcPointX, arcPointY, false);
4080+ }
4081+ }
4082+ }
4083+ }
4084+ }
4085+
4086+ private Name parseName(Node node){
4087+ if(!(node instanceof Element)){
4088+ return null;
4089+ }
4090+ Point offset = parseGraphics(getFirstDirectChild(node, "graphics"), GraphicsType.Offset);
4091+
4092+ String name = getFirstDirectChild(node, "text").getTextContent();
4093+ if(name == null || name.equals("")){
4094+ return null;
4095+ }
4096+
4097+ name = NamePurifier.purify(name);
4098+ return new Name(name, offset);
4099+ }
4100+
4101+ private Point parseGraphics(Node node, GraphicsType type){
4102+ if(!(node instanceof Element)){
4103+ if(type == GraphicsType.Offset)
4104+ return new Point(0, -10);
4105+ else
4106+ return new Point(100, 100);
4107+ }
4108+
4109+ hasPositionalInfo = true;
4110+ Element offset = (Element)getFirstDirectChild(node, type == GraphicsType.Offset ? "offset" : "position");
4111+
4112+ String x = offset.getAttribute("x");
4113+ String y = offset.getAttribute("y");
4114+
4115+ int xd = Math.round(Float.parseFloat(x));
4116+ int yd = Math.round(Float.parseFloat(y));
4117+
4118+ return new Point(xd, yd);
4119+ }
4120+
4121+ private static class Name{
4122+ final String name;
4123+ final Point point;
4124+
4125+ public Name(String newPlaceName) {
4126+ this(newPlaceName, new Point());
4127+ }
4128+
4129+ public Name(String name, Point p) {
4130+ this.name = name;
4131+ this.point = p;
4132+ }
4133+
4134+ @Override
4135+ public String toString() {
4136+ return name + ";" + point;
4137+ }
4138+ }
4139+
4140+ private static class InitialMarking{
4141+ final int marking;
4142+ final Point point;
4143+
4144+ public InitialMarking() {
4145+ this(0, new Point());
4146+ }
4147+
4148+
4149+ public InitialMarking(int marking, Point p) {
4150+ this.marking = marking;
4151+ this.point = p;
4152+ }
4153+
4154+ @Override
4155+ public String toString() {
4156+ return marking + ";" + point;
4157+ }
4158+ }
4159+
4160+ private TimedInputArcComponent parseInputArc(String arcId, TimedPlace place, TimedTransition transition, PlaceTransitionObject source,
4161+ PlaceTransitionObject target, int weight, ArcExpression arcExpression, int _endx,
4162 int _endy, Template template) throws FormatException {
4163-
4164- TimedInputArc inputArc = new TimedInputArc(place, transition, TimeInterval.ZERO_INF, new IntWeight(weight));
4165-
4166- Require.that(places.containsKey(inputArc.source().name()), "The source place must be part of the petri net.");
4167- Require.that(transitions.containsKey(inputArc.destination().name()), "The destination transition must be part of the petri net");
4168- if(!arcs.add(inputArc.source().name() + "-in-" + inputArc.destination().name())) {
4169- throw new FormatException("Multiple arcs between a place and a transition is not allowed");
4170- }
4171-
4172- TimedInputArcComponent arc = null;
4173-
4174- if(isNetDrawable()){
4175- arc = new TimedInputArcComponent(new TimedOutputArcComponent(source, target, weight, arcId), lens);
4176- arc.setUnderlyingArc(inputArc);
4177-
4178- template.guiModel().addPetriNetObject(arc);
4179- }
4180-
4181- template.model().add(inputArc);
4182-
4183- return arc;
4184-
4185-
4186- }
4187-
4188- private Arc parseOutputArc(String arcId, TimedTransition transition, TimedPlace place, PlaceTransitionObject source,
4189- PlaceTransitionObject target, int weight, int _endx,
4190+ TimedInputArc inputArc = new TimedInputArc(place, transition, TimeInterval.ZERO_INF, new IntWeight(weight), arcExpression);
4191+
4192+ Require.that(places.containsKey(inputArc.source().name()), "The source place must be part of the petri net.");
4193+ Require.that(transitions.containsKey(inputArc.destination().name()), "The destination transition must be part of the petri net");
4194+ if(!arcs.add(inputArc.source().name() + "-in-" + inputArc.destination().name())) {
4195+ throw new FormatException("Multiple arcs between a place and a transition is not allowed");
4196+ }
4197+
4198+ TimedInputArcComponent arc = null;
4199+
4200+ if(isNetDrawable()){
4201+ arc = new TimedInputArcComponent(new TimedOutputArcComponent(source, target, weight, arcId), lens);
4202+ arc.setUnderlyingArc(inputArc);
4203+
4204+ template.guiModel().addPetriNetObject(arc);
4205+ }
4206+
4207+ template.model().add(inputArc);
4208+
4209+ return arc;
4210+
4211+
4212+ }
4213+
4214+ private Arc parseOutputArc(String arcId, TimedTransition transition, TimedPlace place, PlaceTransitionObject source,
4215+ PlaceTransitionObject target, int weight, ArcExpression arcExpression, int _endx,
4216 int _endy, Template template) throws FormatException {
4217-
4218- TimedOutputArc outputArc = new TimedOutputArc(transition, place, new IntWeight(weight));
4219-
4220- Require.that(places.containsKey(outputArc.destination().name()), "The destination place must be part of the petri net.");
4221- Require.that(transitions.containsKey(outputArc.source().name()), "The source transition must be part of the petri net");
4222- if(!arcs.add(outputArc.source().name() + "-out-" + outputArc.destination().name())) {
4223- throw new FormatException("Multiple arcs between a place and a transition is not allowed");
4224- }
4225-
4226- TimedOutputArcComponent arc = null;
4227-
4228- if(isNetDrawable()){
4229- arc = new TimedOutputArcComponent(
4230+ TimedOutputArc outputArc = new TimedOutputArc(transition, place, new IntWeight(weight),arcExpression);
4231+
4232+ Require.that(places.containsKey(outputArc.destination().name()), "The destination place must be part of the petri net.");
4233+ Require.that(transitions.containsKey(outputArc.source().name()), "The source transition must be part of the petri net");
4234+ if(!arcs.add(outputArc.source().name() + "-out-" + outputArc.destination().name())) {
4235+ throw new FormatException("Multiple arcs between a place and a transition is not allowed");
4236+ }
4237+
4238+ TimedOutputArcComponent arc = null;
4239+
4240+ if(isNetDrawable()){
4241+ arc = new TimedOutputArcComponent(
4242 source, target, weight, arcId);
4243- arc.setUnderlyingArc(outputArc);
4244-
4245- template.guiModel().addPetriNetObject(arc);
4246-
4247- }
4248-
4249- template.model().add(outputArc);
4250- return arc;
4251- }
4252-
4253- private Arc parseAndAddTimedInhibitorArc(String arcId, TimedPlace place, TimedTransition transition, PlaceTransitionObject source,
4254- PlaceTransitionObject target, int weight, int _endx,
4255+ arc.setUnderlyingArc(outputArc);
4256+
4257+ template.guiModel().addPetriNetObject(arc);
4258+
4259+ }
4260+
4261+ template.model().add(outputArc);
4262+ return arc;
4263+ }
4264+
4265+ private Arc parseAndAddTimedInhibitorArc(String arcId, TimedPlace place, TimedTransition transition, PlaceTransitionObject source,
4266+ PlaceTransitionObject target, int weight, ArcExpression arcExpression, int _endx,
4267 int _endy, Template template) {
4268- TimedInhibitorArcComponent tempArc = new TimedInhibitorArcComponent(
4269- new TimedInputArcComponent(
4270- new TimedOutputArcComponent(source, target, weight, arcId)
4271- ),
4272- (""));
4273-
4274- TimedInhibitorArc inhibArc = new TimedInhibitorArc(place, transition, TimeInterval.ZERO_INF, new IntWeight(weight));
4275-
4276- tempArc.setUnderlyingArc(inhibArc);
4277- template.guiModel().addPetriNetObject(tempArc);
4278- template.model().add(inhibArc);
4279-
4280- return tempArc;
4281- }
4282-
4283- private boolean isNetDrawable(){
4284- return netSize <= maxNetSize;
4285- }
4286-
4287- Node getFirstDirectChild(Node parent, String tagName){
4288- NodeList children = parent.getChildNodes();
4289- for(int i = 0; i < children.getLength(); i++){
4290- if(children.item(i).getNodeName().equals(tagName)){
4291- return children.item(i);
4292- }
4293- }
4294- return null;
4295- }
4296+ TimedInhibitorArcComponent tempArc = new TimedInhibitorArcComponent(
4297+ new TimedInputArcComponent(
4298+ new TimedOutputArcComponent(source, target, weight, arcId)
4299+ ));
4300+
4301+ TimedInhibitorArc inhibArc = new TimedInhibitorArc(place, transition, TimeInterval.ZERO_INF, new IntWeight(weight), arcExpression);
4302+
4303+ tempArc.setUnderlyingArc(inhibArc);
4304+ template.guiModel().addPetriNetObject(tempArc);
4305+ template.model().add(inhibArc);
4306+
4307+ return tempArc;
4308+ }
4309+
4310+ private boolean isNetDrawable(){
4311+ return netSize <= maxNetSize;
4312+ }
4313+
4314+ Node getFirstDirectChild(Node parent, String tagName){
4315+ NodeList children = parent.getChildNodes();
4316+ for(int i = 0; i < children.getLength(); i++){
4317+ if(children.item(i).getNodeName().equals(tagName)){
4318+ return children.item(i);
4319+ }
4320+ }
4321+ return null;
4322+ }
4323
4324 }
4325
4326=== added file 'src/main/java/dk/aau/cs/io/TapnEngineXmlLoader.java'
4327--- src/main/java/dk/aau/cs/io/TapnEngineXmlLoader.java 1970-01-01 00:00:00 +0000
4328+++ src/main/java/dk/aau/cs/io/TapnEngineXmlLoader.java 2022-07-21 13:30:11 +0000
4329@@ -0,0 +1,993 @@
4330+package dk.aau.cs.io;
4331+
4332+import net.tapaal.gui.petrinet.NameGenerator;
4333+import net.tapaal.gui.petrinet.TAPNLens;
4334+import dk.aau.cs.io.queries.TAPNQueryLoader;
4335+import dk.aau.cs.model.CPN.*;
4336+import dk.aau.cs.model.CPN.Expressions.*;
4337+import dk.aau.cs.model.tapn.*;
4338+import dk.aau.cs.util.FormatException;
4339+import dk.aau.cs.util.Require;
4340+import kotlin.Pair;
4341+import org.w3c.dom.Document;
4342+import org.w3c.dom.Element;
4343+import org.w3c.dom.Node;
4344+import org.w3c.dom.NodeList;
4345+import org.xml.sax.SAXException;
4346+import pipe.gui.petrinet.dataLayer.DataLayer;
4347+import net.tapaal.gui.petrinet.Template;
4348+import pipe.gui.Constants;
4349+import pipe.gui.canvas.Zoomer;
4350+import pipe.gui.petrinet.graphicElements.AnnotationNote;
4351+import pipe.gui.petrinet.graphicElements.Arc;
4352+import pipe.gui.petrinet.graphicElements.Place;
4353+import pipe.gui.petrinet.graphicElements.PlaceTransitionObject;
4354+import pipe.gui.petrinet.graphicElements.tapn.*;
4355+
4356+import javax.xml.parsers.DocumentBuilder;
4357+import javax.xml.parsers.DocumentBuilderFactory;
4358+import javax.xml.parsers.ParserConfigurationException;
4359+import java.io.File;
4360+import java.io.IOException;
4361+import java.util.*;
4362+
4363+/*
4364+ This is a huge quick hack to allow reading an unfolded net from then engine.
4365+ The engine format uses <graphics> tags to store elements unlike the tapn format.
4366+
4367+ It feel like this should not work, but it seems to do, and we needed a quick hack to get it working.
4368+
4369+ */
4370+
4371+public class TapnEngineXmlLoader {
4372+ 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.";
4373+
4374+ private final HashMap<TimedTransitionComponent, TimedTransportArcComponent> presetArcs = new HashMap<TimedTransitionComponent, TimedTransportArcComponent>();
4375+ private final HashMap<TimedTransitionComponent, TimedTransportArcComponent> postsetArcs = new HashMap<TimedTransitionComponent, TimedTransportArcComponent>();
4376+ private final HashMap<TimedTransportArcComponent, TimeInterval> transportArcsTimeIntervals = new HashMap<TimedTransportArcComponent, TimeInterval>();
4377+ private final HashMap<TimedTransportArcComponent, List<ColoredTimeInterval>> coloredTransportArcsTimeIntervals = new HashMap<TimedTransportArcComponent, List<ColoredTimeInterval>>();
4378+ private ArcExpression transportExpr;
4379+
4380+ private final NameGenerator nameGenerator = new NameGenerator();
4381+ private boolean firstInhibitorIntervalWarning = true;
4382+ private boolean firstPlaceRenameWarning = true;
4383+ private final IdResolver idResolver = new IdResolver();
4384+ private final Collection<String> messages = new ArrayList<>(10);
4385+ private final LoadTACPN loadTACPN = new LoadTACPN();
4386+
4387+ boolean hasFeatureTag = false;
4388+ private TAPNLens lens = TAPNLens.Default;
4389+
4390+ public TapnEngineXmlLoader() {}
4391+
4392+ public LoadedModel load(File file) throws Exception {
4393+ Require.that(file != null && file.exists(), "file must be non-null and exist");
4394+
4395+ Document doc = loadDocument(file);
4396+ if(doc == null) return null;
4397+ try {
4398+ return parse(doc);
4399+ } catch (FormatException | NullPointerException e) {
4400+ throw e;
4401+ } catch (Exception e) {
4402+ throw new Exception("One or more necessary attributes were not found\n - One or more attribute values have an incorrect type", e);
4403+ }
4404+ }
4405+
4406+ private Document loadDocument(File file) {
4407+ try {
4408+ DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
4409+ return builder.parse(file);
4410+ } catch (ParserConfigurationException | IOException | SAXException e) {
4411+ return null;
4412+ }
4413+ }
4414+
4415+ private LoadedModel parse(Document doc) throws FormatException {
4416+ idResolver.clear();
4417+
4418+ ConstantStore constants = new ConstantStore(parseConstants(doc));
4419+ TimedArcPetriNetNetwork network = new TimedArcPetriNetNetwork(constants, new ArrayList<>());
4420+ NodeList declarations = doc.getElementsByTagName("declaration");
4421+
4422+ if (declarations.getLength() > 0) {
4423+ for (int i = 0; i < declarations.getLength(); i++) {
4424+ Node node = declarations.item(i);
4425+ if (node.getNodeName().equals("declaration")) {
4426+ loadTACPN.parseDeclarations(node, network);
4427+ }
4428+ }
4429+ for(String message : loadTACPN.getMessages()){
4430+ messages.add(message);
4431+ }
4432+ } else{
4433+ network.add(ColorType.COLORTYPE_DOT);
4434+ }
4435+ parseSharedPlaces(doc, network, constants);
4436+ parseSharedTransitions(doc, network);
4437+
4438+ Collection<Template> templates = parseTemplates(doc, network, constants);
4439+ LoadedQueries loadedQueries = new TAPNQueryLoader(doc, network).parseQueries();
4440+
4441+ if (loadedQueries != null) {
4442+ for (String message : loadedQueries.getMessages()) {
4443+ messages.add(message);
4444+ }
4445+ }
4446+ network.buildConstraints();
4447+
4448+ parseBound(doc, network);
4449+
4450+ parseFeature(doc, network);
4451+
4452+ if (hasFeatureTag) {
4453+ return new LoadedModel(network, templates, loadedQueries.getQueries(), messages, lens);
4454+ } else {
4455+ return new LoadedModel(network, templates, loadedQueries.getQueries(), messages, null);
4456+ }
4457+ }
4458+
4459+ private void parseBound(Document doc, TimedArcPetriNetNetwork network){
4460+ if(doc.getElementsByTagName("k-bound").getLength() > 0){
4461+ int i = Integer.parseInt(doc.getElementsByTagName("k-bound").item(0).getAttributes().getNamedItem("bound").getNodeValue());
4462+ network.setDefaultBound(i);
4463+ }
4464+ }
4465+
4466+ private void parseFeature(Document doc, TimedArcPetriNetNetwork network) {
4467+ if (doc.getElementsByTagName("feature").getLength() > 0) {
4468+ NodeList nodeList = doc.getElementsByTagName("feature");
4469+
4470+ hasFeatureTag = true;
4471+
4472+ var isTimedElement = nodeList.item(0).getAttributes().getNamedItem("isTimed");
4473+ boolean isTimed = isTimedElement == null ? network.isTimed() : Boolean.parseBoolean(isTimedElement.getNodeValue());
4474+
4475+ var isGameElement = nodeList.item(0).getAttributes().getNamedItem("isGame");
4476+ boolean isGame = isGameElement == null ? network.hasUncontrollableTransitions() : Boolean.parseBoolean(isGameElement.getNodeValue());
4477+
4478+ var isColoredElement = nodeList.item(0).getAttributes().getNamedItem("isColored");
4479+ boolean isColored = isColoredElement == null ? network.isColored() : Boolean.parseBoolean(isColoredElement.getNodeValue());
4480+
4481+ lens = new TAPNLens(isTimed, isGame, isColored);
4482+ }
4483+ }
4484+
4485+ private void parseFeature(Document doc) {
4486+ if (doc.getElementsByTagName("feature").getLength() > 0) {
4487+ NodeList nodeList = doc.getElementsByTagName("feature");
4488+
4489+ hasFeatureTag = true;
4490+
4491+ var isTimed = Boolean.parseBoolean(nodeList.item(0).getAttributes().getNamedItem("isTimed").getNodeValue());
4492+ var isGame = Boolean.parseBoolean(nodeList.item(0).getAttributes().getNamedItem("isGame").getNodeValue());
4493+ var isColored = Boolean.parseBoolean(nodeList.item(0).getAttributes().getNamedItem("isColored").getNodeValue());
4494+
4495+ lens = new TAPNLens(isTimed, isGame, isColored);
4496+ }
4497+ }
4498+
4499+ private void parseSharedPlaces(Document doc, TimedArcPetriNetNetwork network, ConstantStore constants) {
4500+ NodeList sharedPlaceNodes = doc.getElementsByTagName("shared-place");
4501+
4502+ for(int i = 0; i < sharedPlaceNodes.getLength(); i++){
4503+ Node node = sharedPlaceNodes.item(i);
4504+
4505+ if(node instanceof Element){
4506+ SharedPlace place = parseSharedPlace((Element)node, network, constants);
4507+ network.add(place);
4508+ }
4509+ }
4510+ }
4511+
4512+ private SharedPlace parseSharedPlace(Element element, TimedArcPetriNetNetwork network, ConstantStore constants) {
4513+ String name = element.getAttribute("name");
4514+ TimeInvariant invariant = TimeInvariant.parse(element.getAttribute("invariant"), constants);
4515+ //int numberOfTokens = Integer.parseInt(element.getAttribute("initialMarking"));
4516+
4517+ if(name.equalsIgnoreCase("true") || name.equalsIgnoreCase("false")) {
4518+ name = "_" + name;
4519+ if(firstPlaceRenameWarning) {
4520+ messages.add(PLACENAME_ERROR_MESSAGE);
4521+ firstPlaceRenameWarning = false;
4522+ }
4523+ }
4524+ SharedPlace place = new SharedPlace(name, invariant);
4525+ place.setCurrentMarking(network.marking());
4526+ place.setColorType(parsePlaceColorType(element));
4527+ //place.addTokens(numbesrOfTokens);
4528+ addColoredDependencies(place,element, network, constants);
4529+
4530+
4531+ return place;
4532+ }
4533+
4534+ private void parseSharedTransitions(Document doc, TimedArcPetriNetNetwork network) {
4535+ NodeList sharedTransitionNodes = doc.getElementsByTagName("shared-transition");
4536+
4537+ for(int i = 0; i < sharedTransitionNodes.getLength(); i++){
4538+ Node node = sharedTransitionNodes.item(i);
4539+
4540+ if(node instanceof Element){
4541+ SharedTransition transition = parseSharedTransition((Element)node);
4542+ network.add(transition);
4543+ }
4544+ }
4545+ }
4546+
4547+ private SharedTransition parseSharedTransition(Element element) {
4548+ String name = element.getAttribute("name");
4549+ boolean urgent = Boolean.parseBoolean(element.getAttribute("urgent"));
4550+ boolean isUncontrollable = element.getAttribute("player").equals("1");
4551+
4552+ SharedTransition st = new SharedTransition(name);
4553+ st.setUrgent(urgent);
4554+ st.setUncontrollable(isUncontrollable);
4555+ return st;
4556+ }
4557+
4558+ private Collection<Template> parseTemplates(Document doc, TimedArcPetriNetNetwork network, ConstantStore constants) throws FormatException {
4559+ Collection<Template> templates = new ArrayList<Template>();
4560+ NodeList nets = doc.getElementsByTagName("net");
4561+
4562+ if(nets.getLength() <= 0)
4563+ throw new FormatException("File did not contain any TAPN components.");
4564+
4565+ for (int i = 0; i < nets.getLength(); i++) {
4566+ Template template = parseTimedArcPetriNet(nets.item(i), network, constants);
4567+ template.setHasPositionalInfo(true); //We assume that all templates have positional info
4568+ templates.add(template);
4569+ }
4570+ return templates;
4571+ }
4572+
4573+ private List<Constant> parseConstants(Document doc) {
4574+ List<Constant> constants = new ArrayList<Constant>();
4575+ NodeList constantNodes = doc.getElementsByTagName("constant");
4576+ for (int i = 0; i < constantNodes.getLength(); i++) {
4577+ Node c = constantNodes.item(i);
4578+
4579+ if (c instanceof Element) {
4580+ Constant constant = parseConstant((Element) c);
4581+ constants.add(constant);
4582+ }
4583+ }
4584+ return constants;
4585+ }
4586+
4587+ private Template parseTimedArcPetriNet(Node tapnNode, TimedArcPetriNetNetwork network, ConstantStore constants) throws FormatException {
4588+ String name = getTAPNName(tapnNode);
4589+
4590+ boolean active = getActiveStatus(tapnNode);
4591+
4592+ TimedArcPetriNet tapn = new TimedArcPetriNet(name);
4593+ tapn.setActive(active);
4594+ network.add(tapn);
4595+ nameGenerator.add(tapn);
4596+
4597+ DataLayer guiModel = new DataLayer();
4598+ Template template = new Template(tapn, guiModel, new Zoomer());
4599+
4600+ NodeList nodeList = tapnNode.getChildNodes();
4601+ for (int i = 0; i < nodeList.getLength(); i++) {
4602+
4603+ Node node = nodeList.item(i);
4604+ if(node instanceof Element){
4605+ parseElement((Element)node, template, network, constants);
4606+ }
4607+ }
4608+
4609+ return template;
4610+ }
4611+
4612+ private boolean getActiveStatus(Node tapnNode) {
4613+ if (tapnNode instanceof Element) {
4614+ Element element = (Element)tapnNode;
4615+ String activeString = element.getAttribute("active");
4616+
4617+ if (activeString == null || activeString.equals(""))
4618+ return true;
4619+ else
4620+ return activeString.equals("true");
4621+ } else {
4622+ return true;
4623+ }
4624+ }
4625+
4626+ private void parseElement(Element element, Template template, TimedArcPetriNetNetwork network, ConstantStore constants) throws FormatException {
4627+ if ("labels".equals(element.getNodeName())) {
4628+ AnnotationNote note = parseAnnotation(element);
4629+ template.guiModel().addPetriNetObject(note);
4630+ } else if ("place".equals(element.getNodeName())) {
4631+ TimedPlaceComponent place = parsePlace(element, network, template.model(), constants);
4632+ template.guiModel().addPetriNetObject(place);
4633+ } else if ("transition".equals(element.getNodeName())) {
4634+ TimedTransitionComponent transition = parseTransition(element, network, template.model());
4635+ template.guiModel().addPetriNetObject(transition);
4636+ } else if (element.getNodeName().matches("arc|outputArc|inputArc|inhibitorArc|transportArc")) {
4637+ parseAndAddArc(element, template, constants, network);
4638+ }
4639+ }
4640+
4641+ private boolean isNameAllowed(String name) {
4642+ Require.that(name != null, "name was null");
4643+
4644+ return !name.isEmpty() && java.util.regex.Pattern.matches("[a-zA-Z]([_a-zA-Z0-9])*", name);
4645+ }
4646+
4647+
4648+ private String getTAPNName(Node tapnNode) {
4649+ if (tapnNode instanceof Element) {
4650+ Element element = (Element)tapnNode;
4651+ String name = element.getAttribute("name");
4652+
4653+ if (name == null || name.equals(""))
4654+ name = element.getAttribute("id");
4655+
4656+ if(!isNameAllowed(name)){
4657+ name = nameGenerator.getNewTemplateName();
4658+ }
4659+ nameGenerator.updateTemplateIndex(name);
4660+ return name;
4661+ } else {
4662+ return nameGenerator.getNewTemplateName();
4663+ }
4664+ }
4665+
4666+ private AnnotationNote parseAnnotation(Element annotation) {
4667+ int positionXInput = 0;
4668+ int positionYInput = 0;
4669+ int widthInput = 0;
4670+ int heightInput = 0;
4671+ boolean borderInput = true;
4672+
4673+ String positionXTempStorage = annotation.getAttribute("positionX");
4674+ String positionYTempStorage = annotation.getAttribute("positionY");
4675+ String widthTemp = annotation.getAttribute("width");
4676+ String heightTemp = annotation.getAttribute("height");
4677+ String borderTemp = annotation.getAttribute("border");
4678+
4679+ String text = annotation.getTextContent();
4680+
4681+ if (positionXTempStorage.length() > 0) {
4682+ positionXInput = Integer.parseInt(positionXTempStorage) + 1;
4683+ }
4684+
4685+ if (positionYTempStorage.length() > 0) {
4686+ positionYInput = Integer.parseInt(positionYTempStorage) + 1;
4687+ }
4688+
4689+ if (widthTemp.length() > 0) {
4690+ widthInput = Integer.parseInt(widthTemp) + 1;
4691+ }
4692+
4693+ if (heightTemp.length() > 0) {
4694+ heightInput = Integer.parseInt(heightTemp) + 1;
4695+ }
4696+
4697+ if (borderTemp.length() > 0) {
4698+ borderInput = Boolean.parseBoolean(borderTemp);
4699+ } else {
4700+ borderInput = true;
4701+ }
4702+ return new AnnotationNote(text, positionXInput, positionYInput, widthInput, heightInput, borderInput);
4703+ }
4704+
4705+ private TimedTransitionComponent parseTransition(Element transition, TimedArcPetriNetNetwork network, TimedArcPetriNet tapn) {
4706+ String posX = transition.getAttribute("positionX");
4707+ String posY = transition.getAttribute("positionY");
4708+ String nameOffsetX = transition.getAttribute("nameOffsetX");
4709+ String nameOffsetY = transition.getAttribute("nameOffsetY");
4710+ String angleStr = transition.getAttribute("angle");
4711+ String priorityStr = transition.getAttribute("priority");
4712+ int positionXInput = 0;
4713+ int positionYInput = 0;
4714+ int nameOffsetXInput = 0;
4715+ int nameOffsetYInput = 0;
4716+ int angle = 0;
4717+ int priority = 0;
4718+ if(!posX.isEmpty()){
4719+ positionXInput = (int)Double.parseDouble(posX);
4720+ }
4721+ if(!posY.isEmpty()){
4722+ positionYInput = (int)Double.parseDouble(posY);
4723+ }
4724+
4725+ var g = transition.getElementsByTagName("position");
4726+ if (g.getLength() > 0) {
4727+ positionXInput = Integer.parseInt(((Element) g.item(0)).getAttribute("x"));
4728+ positionYInput = Integer.parseInt(((Element) g.item(0)).getAttribute("y"));
4729+ }
4730+
4731+ if(!nameOffsetX.isEmpty()){
4732+ nameOffsetXInput = (int)Double.parseDouble(nameOffsetX);
4733+ }
4734+ if(!nameOffsetY.isEmpty()){
4735+ nameOffsetYInput = (int)Double.parseDouble(nameOffsetY);
4736+ }
4737+ if(!angleStr.isEmpty()){
4738+ angle = Integer.parseInt(angleStr);
4739+ }
4740+ if(!priorityStr.isEmpty()){
4741+ priority = Integer.parseInt(priorityStr);
4742+ }
4743+ String idInput = transition.getAttribute("id");
4744+ String nameInput = transition.getAttribute("name");
4745+ boolean isUrgent = Boolean.parseBoolean(transition.getAttribute("urgent"));
4746+
4747+ String player = transition.getAttribute("player");
4748+
4749+ idResolver.add(tapn.name(), idInput, nameInput);
4750+
4751+ boolean infiniteServer = transition.getAttribute("infiniteServer").equals("true");
4752+
4753+ boolean displayName = transition.getAttribute("displayName").equals("false") ? false : true;
4754+
4755+
4756+ if (idInput.length() == 0 && nameInput.length() > 0) {
4757+ idInput = nameInput;
4758+ }
4759+
4760+ if (nameInput.length() == 0 && idInput.length() > 0) {
4761+ nameInput = idInput;
4762+ }
4763+ GuardExpression guardExpr = null;
4764+
4765+ Node conditionNode = getFirstDirectChild(transition, "condition");
4766+ if (conditionNode != null) {
4767+ try {
4768+ guardExpr = loadTACPN.parseGuardExpression(getFirstDirectChild(conditionNode, "structure"));
4769+ } catch (FormatException e) {
4770+ e.printStackTrace();
4771+ }
4772+ }
4773+
4774+ TimedTransition t = new TimedTransition(nameInput, guardExpr);
4775+ t.setUrgent(isUrgent);
4776+ t.setUncontrollable(player.equals("1"));
4777+ if(network.isNameUsedForShared(nameInput)){
4778+ t.setName(nameGenerator.getNewTransitionName(tapn)); // introduce temporary name to avoid exceptions
4779+ tapn.add(t);
4780+ network.getSharedTransitionByName(nameInput).makeShared(t);
4781+ }else{
4782+ tapn.add(t);
4783+ }
4784+ nameGenerator.updateIndicesForAllModels(nameInput);
4785+ TimedTransitionComponent transitionComponent = new TimedTransitionComponent(
4786+ positionXInput, positionYInput, idInput,
4787+ nameOffsetXInput, nameOffsetYInput,
4788+ angle, lens);
4789+ transitionComponent.setUnderlyingTransition(t);
4790+
4791+ if (!displayName){
4792+ transitionComponent.setAttributesVisible(false);
4793+ }
4794+ return transitionComponent;
4795+ }
4796+
4797+ private TimedPlaceComponent parsePlace(Element place, TimedArcPetriNetNetwork network, TimedArcPetriNet tapn, ConstantStore constants) {
4798+ String placePosX = place.getAttribute("positionX");
4799+ String placePosY = place.getAttribute("positionY");
4800+ String nameOffsetX = place.getAttribute("nameOffsetX");
4801+ String nameOffsetY = place.getAttribute("nameOffsetY");
4802+ int positionXInput = 0;
4803+ int positionYInput = 0;
4804+ if(!placePosX.isBlank()){
4805+ positionXInput = (int)Double.parseDouble(placePosX);
4806+ }
4807+ if(!placePosY.isBlank()){
4808+ positionYInput = (int)Double.parseDouble(placePosY);
4809+ }
4810+
4811+ var g = place.getElementsByTagName("position");
4812+ if (g.getLength() > 0) {
4813+ positionXInput = Integer.parseInt(((Element) g.item(0)).getAttribute("x"));
4814+ positionYInput = Integer.parseInt(((Element) g.item(0)).getAttribute("y"));
4815+ }
4816+
4817+ String idInput = place.getAttribute("id");
4818+ String nameInput = place.getAttribute("name");
4819+
4820+ int nameOffsetXInput = 0;
4821+ int nameOffsetYInput = 0;
4822+ if(!nameOffsetX.isEmpty()){
4823+ nameOffsetXInput = (int)Double.parseDouble(nameOffsetX);
4824+ }
4825+ if(!nameOffsetY.isEmpty()){
4826+ nameOffsetYInput = (int)Double.parseDouble(nameOffsetY);
4827+ }
4828+
4829+ String invariant = place.getAttribute("invariant");
4830+ boolean displayName = place.getAttribute("displayName").equals("false") ? false : true;
4831+
4832+ if (idInput.length() == 0 && nameInput.length() > 0) {
4833+ idInput = nameInput;
4834+ }
4835+
4836+ if (nameInput.length() == 0 && idInput.length() > 0) {
4837+ nameInput = idInput;
4838+ }
4839+
4840+ if(nameInput.equalsIgnoreCase("true") || nameInput.equalsIgnoreCase("false")) {
4841+ nameInput = "_" + nameInput;
4842+ if(firstPlaceRenameWarning) {
4843+ messages.add(PLACENAME_ERROR_MESSAGE);
4844+ firstPlaceRenameWarning = false;
4845+ }
4846+ }
4847+
4848+ idResolver.add(tapn.name(), idInput, nameInput);
4849+
4850+ TimedPlace p;
4851+ if(network.isNameUsedForShared(nameInput)){
4852+ p = network.getSharedPlaceByName(nameInput);
4853+ tapn.add(p);
4854+ }else{
4855+ p = new LocalTimedPlace(nameInput, TimeInvariant.parse(invariant, constants), parsePlaceColorType(place));
4856+ tapn.add(p);
4857+ addColoredDependencies(p,place, network, constants);
4858+
4859+ }
4860+ nameGenerator.updateIndicesForAllModels(nameInput);
4861+ TimedPlaceComponent placeComponent = new TimedPlaceComponent(positionXInput, positionYInput, idInput, nameOffsetXInput, nameOffsetYInput, lens);
4862+ placeComponent.setUnderlyingPlace(p);
4863+
4864+ if (!displayName){
4865+ placeComponent.setAttributesVisible(false);
4866+ }
4867+
4868+ return placeComponent;
4869+ }
4870+
4871+ private ColorType parsePlaceColorType(Element element){
4872+ ColorType ct = ColorType.COLORTYPE_DOT;
4873+ Node typeNode = element.getElementsByTagName("type").item(0);
4874+ if (typeNode != null) {
4875+ try {
4876+ ct = loadTACPN.parseUserSort(typeNode);
4877+ } catch (FormatException e) {
4878+ e.printStackTrace();
4879+ }
4880+ }
4881+ return ct;
4882+ }
4883+
4884+ private void addColoredDependencies(TimedPlace p, Element place, TimedArcPetriNetNetwork network, ConstantStore constants){
4885+ List<ColoredTimeInvariant> ctiList = new ArrayList<ColoredTimeInvariant>();
4886+ int initialMarkingInput = Integer.parseInt(place.getAttribute("initialMarking"));
4887+
4888+ ArcExpression colorMarking = null;
4889+ NodeList nodes = place.getElementsByTagName("colorinvariant");
4890+ if (nodes != null) {
4891+ for (int i = 0; i < nodes.getLength(); i++) {
4892+ Pair<String, Vector<Color>> pair = parseColorInvariant((Element) nodes.item(i), network);
4893+ ColoredTimeInvariant cti = ColoredTimeInvariant.parse(pair.getFirst(), constants, pair.getSecond());
4894+ ctiList.add(cti);
4895+ }
4896+ }
4897+ if (place.getAttribute("inscription").length() > 0) {
4898+ ctiList.add(ColoredTimeInvariant.parse(place.getAttribute("inscription"), constants, new Vector<Color>() {{
4899+ add(Color.STAR_COLOR);
4900+ }}));
4901+ }
4902+ Node hlInitialMarkingNode = place.getElementsByTagName("hlinitialMarking").item(0);
4903+
4904+ if (hlInitialMarkingNode instanceof Element) {
4905+ try {
4906+ colorMarking = loadTACPN.parseArcExpression(((Element)hlInitialMarkingNode).getElementsByTagName("structure").item(0));
4907+ } catch (FormatException e) {
4908+ e.printStackTrace();
4909+ }
4910+ }
4911+
4912+
4913+ p.setCtiList(ctiList);
4914+ ExpressionContext context = new ExpressionContext(new HashMap<String, Color>(), loadTACPN.getColortypes());
4915+ if(colorMarking!= null){
4916+ ColorMultiset cm = colorMarking.eval(context);
4917+
4918+ p.setTokenExpression(loadTACPN.constructCleanAddExpression(p.getColorType(),cm));
4919+
4920+
4921+ for (TimedToken ctElement : cm.getTokens(p)) {
4922+ network.marking().add(ctElement);
4923+ //p.addToken(ctElement);
4924+ }
4925+
4926+ } else {
4927+ for (int i = 0; i < initialMarkingInput; i++) {
4928+ //Regular tokens will just be dotconstant
4929+ network.marking().add(new TimedToken(p, ColorType.COLORTYPE_DOT.getFirstColor()));
4930+ }
4931+ if(initialMarkingInput > 1) {
4932+ Vector<ColorExpression> v = new Vector<>();
4933+ v.add(new DotConstantExpression());
4934+ Vector<ArcExpression> numbOfExpression = new Vector<>();
4935+ numbOfExpression.add(new NumberOfExpression(initialMarkingInput, v));
4936+ p.setTokenExpression(new AddExpression(numbOfExpression));
4937+ }
4938+ }
4939+ }
4940+
4941+ private void parseAndAddArc(Element arc, Template template, ConstantStore constants, TimedArcPetriNetNetwork network) throws FormatException {
4942+ String idInput = arc.getAttribute("id");
4943+ String sourceInput = arc.getAttribute("source");
4944+ String targetInput = arc.getAttribute("target");
4945+ boolean taggedArc = arc.getAttribute("tagged").equals("true") ? true : false;
4946+ String inscriptionTempStorage = arc.getAttribute("inscription");
4947+ String type = arc.getAttribute("type");
4948+ if(type.isEmpty()){
4949+ switch (arc.getNodeName()) {
4950+ case "transportArc":
4951+ type = "transport";
4952+ break;
4953+ case "inhibitorArc":
4954+ type = "inhibitor";
4955+ break;
4956+ case "inputArc":
4957+ type = "timed";
4958+ break;
4959+ default:
4960+ type = "";
4961+ break;
4962+ }
4963+ }
4964+ int nameOffsetXInput;
4965+ int nameOffsetYInput;
4966+
4967+ //This check is done, as arcs in nets saved before this change do not have a nameOffset
4968+ if(!arc.getAttribute("nameOffsetX").equals("") && !arc.getAttribute("nameOffsetY").equals("")) {
4969+ nameOffsetXInput = (int) Double.parseDouble(arc.getAttribute("nameOffsetX"));
4970+ nameOffsetYInput = (int) Double.parseDouble(arc.getAttribute("nameOffsetY"));
4971+ } else {
4972+ nameOffsetXInput = 0;
4973+ nameOffsetYInput = 0;
4974+ }
4975+
4976+ sourceInput = idResolver.get(template.model().name(), sourceInput);
4977+ targetInput = idResolver.get(template.model().name(), targetInput);
4978+
4979+ PlaceTransitionObject sourceIn = template.guiModel().getPlaceTransitionObject(sourceInput);
4980+ PlaceTransitionObject targetIn = template.guiModel().getPlaceTransitionObject(targetInput);
4981+
4982+ // add the insets and offset
4983+ int _startx = sourceIn.getX() + sourceIn.centreOffsetLeft();
4984+ int _starty = sourceIn.getY() + sourceIn.centreOffsetTop();
4985+
4986+ int _endx = targetIn.getX() + targetIn.centreOffsetLeft();
4987+ int _endy = targetIn.getY() + targetIn.centreOffsetTop();
4988+
4989+ //Get weight if any
4990+ Weight weight = new IntWeight(1);
4991+ if(arc.hasAttribute("weight")){
4992+ weight = Weight.parseWeight(arc.getAttribute("weight"), constants);
4993+ }
4994+ ArcExpression arcExpr = null;
4995+ List<ColoredTimeInterval> ctiList = new ArrayList<ColoredTimeInterval>();
4996+ Node hlInscription = getFirstDirectChild(arc, "hlinscription");
4997+ if (hlInscription != null)
4998+ hlInscription = getFirstDirectChild(hlInscription, "structure");
4999+ if (hlInscription != null)
5000+ arcExpr = loadTACPN.parseArcExpression(hlInscription);
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches