├── .editorconfig ├── .gitattributes ├── .github ├── CODEOWNERS ├── dependabot.yml └── workflows │ ├── beamer.yaml │ ├── docsify.yaml │ ├── gfm.yaml │ ├── pdf.yaml │ └── tests.yaml ├── .gitignore ├── .gitmodules ├── .nojekyll ├── CITATION.cff ├── CREDITS.md ├── LICENSE.md ├── Makefile ├── admin ├── exams.md ├── images │ └── fahrplan.png ├── planung_pm.xlsx └── readme.md ├── homework ├── b01.md ├── b02.md ├── b03.md ├── b04.md ├── b05.md ├── b06.md ├── b07.md ├── b08.md ├── b09.md ├── images │ ├── bridgetroll-annot.excalidraw │ ├── bridgetroll-annot.png │ └── bridgetroll.png └── readme.md ├── lecture ├── building │ ├── ant.md │ ├── ci.md │ ├── docker.md │ ├── gradle.md │ ├── images │ │ ├── ci.png │ │ ├── screenshot-githubci-job.png │ │ ├── screenshot-githubci-triggeredworkflow.png │ │ ├── screenshot-githubci-workflows.png │ │ ├── screenshot-gitlabci-job.png │ │ ├── screenshot-gitlabci-pipelines.png │ │ ├── screenshot-gitlabci-triggeredpipeline.png │ │ ├── screenshot_github_actions.png │ │ ├── screenshot_github_settings_actions.png │ │ ├── screenshot_github_settings_permissions.png │ │ ├── screenshot_maven-lifecycle.png │ │ ├── screenshot_maven-project.png │ │ ├── virtualisierung.png │ │ └── vscode-remote.png │ ├── maven.md │ ├── readme.md │ └── src │ │ ├── Dockerfile │ │ ├── Makefile │ │ ├── ant │ │ ├── Hello.java │ │ ├── build.xml │ │ ├── hello.xml │ │ ├── ivy.xml │ │ └── ivydemo.xml │ │ ├── docker │ │ ├── .github │ │ │ └── workflows │ │ │ │ └── demo.yml │ │ ├── .gitlab-ci.yml │ │ ├── Hello.java │ │ └── debian-latex.df │ │ └── maven │ │ ├── Hello.java │ │ └── pom.xml ├── git │ ├── bisect.md │ ├── branches.md │ ├── branching-strategies.md │ ├── git-basics.md │ ├── git-intro.md │ ├── images │ │ ├── after.excalidraw │ │ ├── after.png │ │ ├── before.excalidraw │ │ ├── before.png │ │ ├── centralised.png │ │ ├── distributed.png │ │ ├── lifecycle.png │ │ ├── linkedworktrees.png │ │ ├── local.png │ │ ├── remote-branches-2.excalidraw │ │ ├── remote-branches-2.png │ │ ├── screenshot_branches.png │ │ ├── screenshot_git_log.png │ │ ├── screenshot_git_log_recent.png │ │ ├── screenshot_merge-request_code.png │ │ ├── screenshot_merge-request_discussion.png │ │ ├── screenshot_zusammenarbeit_ohne_vcs.png │ │ ├── workflow.png │ │ └── workflow_remote.png │ ├── readme.md │ ├── remotes.md │ ├── workflows.md │ └── worktree.md ├── gui │ ├── events.md │ ├── images │ │ ├── ActionListener.png │ │ ├── ActionListener.uxf │ │ ├── EventListener.png │ │ ├── EventListener.uxf │ │ ├── EventObject.png │ │ ├── EventObject.uxf │ │ ├── java2d-koordinaten.png │ │ ├── java2d.png │ │ ├── mvc.drawio │ │ ├── mvc.png │ │ ├── observer.png │ │ ├── observer.uxf │ │ ├── screenshot-borderlayout.png │ │ ├── screenshot-dialog.png │ │ ├── screenshot-filechooser.png │ │ ├── screenshot-flowlayout.png │ │ ├── screenshot-gridlayout.png │ │ └── screenshot-radiobuttons.png │ ├── java2d.md │ ├── layouts.md │ ├── readme.md │ ├── src │ │ ├── basics │ │ │ ├── FirstWindow.java │ │ │ └── SecondWindow.java │ │ ├── challenges │ │ │ └── tictactoe │ │ │ │ ├── Gamestate.java │ │ │ │ ├── Icon.java │ │ │ │ ├── Player.java │ │ │ │ └── TicTacToe.java │ │ ├── events │ │ │ ├── DemoStarter.java │ │ │ ├── ListenerDemo.java │ │ │ ├── MouseAdapterDemo.java │ │ │ └── MouseListenerDemo.java │ │ ├── java2d │ │ │ ├── DemoStarter.java │ │ │ ├── SimpleDrawings.java │ │ │ ├── SimpleFonts.java │ │ │ ├── SimplePoly.java │ │ │ └── simplegame │ │ │ │ ├── GameObject.java │ │ │ │ ├── GameOval.java │ │ │ │ ├── GameRect.java │ │ │ │ ├── GameString.java │ │ │ │ └── J2DTeaser.java │ │ ├── layout │ │ │ ├── Border.java │ │ │ ├── DemoStarter.java │ │ │ ├── Flow.java │ │ │ ├── Grid.java │ │ │ └── GridBag.java │ │ ├── tables │ │ │ ├── DemoStarter.java │ │ │ ├── ModelTable.java │ │ │ ├── SelectTable.java │ │ │ └── SimpleTable.java │ │ └── widgets │ │ │ ├── DemoStarter.java │ │ │ ├── DialogDemo.java │ │ │ ├── FileChooserDemo.java │ │ │ ├── MenuDemo.java │ │ │ ├── PopupDemo.java │ │ │ ├── RadioButtonDemo.java │ │ │ └── TabbedPaneDemo.java │ ├── swing-basics.md │ ├── tables.md │ └── widgets.md ├── java-classic │ ├── annotations.md │ ├── collections.md │ ├── configuration.md │ ├── enums.md │ ├── exceptions.md │ ├── generics-bounds-wildcards.md │ ├── generics-classes-methods.md │ ├── generics-polymorphism.md │ ├── generics-type-erasure.md │ ├── images │ │ ├── ThreadRunnable.png │ │ ├── ThreadRunnable.uxf │ │ ├── arraylist.gif │ │ ├── arraylist.png │ │ ├── collection.png │ │ ├── collection.uxf │ │ ├── collections.png │ │ ├── collections.uxf │ │ ├── collections_table.png │ │ ├── collections_table_vorlage.numbers │ │ ├── exception.png │ │ ├── exception.uxf │ │ ├── gif_vorlage │ │ │ ├── arraylist_vorlage.pptx │ │ │ ├── iterator_vorlage.pptx │ │ │ └── linkedlist_vorlage.pptx │ │ ├── hashmap.png │ │ ├── hashmap.uxf │ │ ├── ide-cli.png │ │ ├── iterator.gif │ │ ├── iterator.png │ │ ├── iterator.uxf │ │ ├── iteratoruml.drawio │ │ ├── iteratoruml.png │ │ ├── linkedlist.gif │ │ ├── linkedlist.png │ │ ├── map.png │ │ ├── map.uxf │ │ ├── screenshot_infer-notnull.png │ │ ├── screenshot_nullpointerexception-notnull.png │ │ ├── screenshot_swingworker.png │ │ ├── uml_serialisierung.png │ │ └── uml_serialisierung.uxf │ ├── readme.md │ ├── reflection.md │ ├── regexp.md │ ├── serialisation.md │ ├── src │ │ ├── META-INF │ │ │ └── services │ │ │ │ └── javax.annotation.processing.Processor │ │ ├── annotations │ │ │ ├── A.java │ │ │ ├── B.java │ │ │ ├── C.java │ │ │ ├── Foo.java │ │ │ └── WuppieAnnotation.java │ │ ├── arrays │ │ │ └── X.java │ │ ├── bounds │ │ │ └── Cps.java │ │ ├── challenges │ │ │ ├── exceptions │ │ │ │ ├── better_try_catch │ │ │ │ │ ├── BetterTryCatchMain.java │ │ │ │ │ ├── MyFunctions.java │ │ │ │ │ └── NoNumberFoundException.java │ │ │ │ ├── finally_resources │ │ │ │ │ ├── MyException.java │ │ │ │ │ └── MyResource.java │ │ │ │ └── where_to_catch │ │ │ │ │ ├── JustThrow.java │ │ │ │ │ └── MyException.java │ │ │ ├── reflection │ │ │ │ ├── calculator │ │ │ │ │ ├── CalculatorUI.java │ │ │ │ │ ├── Main.java │ │ │ │ │ └── OperationLoader.java │ │ │ │ └── operations │ │ │ │ │ └── IOperation.java │ │ │ ├── regexp │ │ │ │ ├── Lexer.java │ │ │ │ ├── LexerUI.java │ │ │ │ ├── MyMatchResult.java │ │ │ │ └── Token.java │ │ │ └── threads │ │ │ │ ├── BlueHamster.java │ │ │ │ ├── Hamster.java │ │ │ │ ├── Main.java │ │ │ │ ├── RedHamster.java │ │ │ │ └── Tunnel.java │ │ ├── classes │ │ │ └── GenericClasses.java │ │ ├── cli │ │ │ ├── Args.java │ │ │ ├── Props.java │ │ │ └── Teaser.java │ │ ├── collections │ │ │ ├── hash_example │ │ │ │ ├── HashCodeExample.java │ │ │ │ └── Point.java │ │ │ └── iterator_example │ │ │ │ ├── BinarySearchTree.java │ │ │ │ ├── InorderIterator.java │ │ │ │ └── IteratorExample.java │ │ ├── creation │ │ │ ├── ThreadRunnable.java │ │ │ └── ThreadedKaputt.java │ │ ├── enums │ │ │ ├── FinalDemo.java │ │ │ ├── v1 │ │ │ │ └── Studi.java │ │ │ ├── v2 │ │ │ │ └── Studi.java │ │ │ └── v3 │ │ │ │ ├── Fach.java │ │ │ │ └── Studi.java │ │ ├── exceptions │ │ │ ├── DivExample.java │ │ │ ├── HowMuchTry.java │ │ │ ├── MyCheckedException.java │ │ │ ├── MyUncheckedException.java │ │ │ └── WhereToCatch.java │ │ ├── executor │ │ │ └── ExecutorDemo.java │ │ ├── forkjoin │ │ │ └── ForkJoin.java │ │ ├── intro │ │ │ ├── Join.java │ │ │ ├── Threaded.java │ │ │ └── Traditional.java │ │ ├── lock │ │ │ ├── LockObjects.java │ │ │ └── TradMonitors.java │ │ ├── methods │ │ │ └── GenericMethods.java │ │ ├── misc │ │ │ └── SwingWorkerDemo.java │ │ ├── reflection │ │ │ ├── ClassLoaderDemo.java │ │ │ ├── ReflectionDemo.java │ │ │ ├── Studi.java │ │ │ └── Wuppie.java │ │ ├── regexp │ │ │ ├── Backref.java │ │ │ ├── Groups.java │ │ │ ├── MatchFind.java │ │ │ ├── Quantifier.java │ │ │ └── StringSplit.java │ │ ├── serial │ │ │ ├── SerializableStudi.java │ │ │ └── TestSerializableStudi.java │ │ ├── synchronised │ │ │ ├── Deadlock.java │ │ │ ├── MethodSync.java │ │ │ ├── ObjSync.java │ │ │ ├── Staffel.java │ │ │ └── Teaser.java │ │ └── wildcards │ │ │ ├── v1 │ │ │ └── X.java │ │ │ ├── v2 │ │ │ └── X.java │ │ │ └── v3 │ │ │ └── X.java │ ├── threads-highlevel.md │ ├── threads-intro.md │ └── threads-synchronisation.md ├── java-modern │ ├── defaultmethods.md │ ├── images │ │ ├── screenshot_katze.png │ │ ├── screenshot_review1.png │ │ ├── screenshot_review2.png │ │ └── screenshot_review3.png │ ├── lambdas.md │ ├── methodreferences.md │ ├── optional.md │ ├── readme.md │ ├── records.md │ ├── src │ │ ├── challenges │ │ │ ├── defaults │ │ │ │ ├── Enten.java │ │ │ │ ├── Kolibris.java │ │ │ │ ├── Main.java │ │ │ │ ├── Pinguine.java │ │ │ │ └── Voegel.java │ │ │ ├── lambda │ │ │ │ ├── Student.java │ │ │ │ └── StudentSort.java │ │ │ ├── optional │ │ │ │ ├── Box.java │ │ │ │ ├── Katze.java │ │ │ │ ├── KatzenCafe.java │ │ │ │ └── Material.java │ │ │ └── streams │ │ │ │ ├── Main.java │ │ │ │ ├── Student.java │ │ │ │ └── file.txt │ │ ├── defaultmethods │ │ │ ├── quiz │ │ │ │ └── DefaultTest.java │ │ │ ├── rule1 │ │ │ │ └── DefaultTest1.java │ │ │ ├── rule2 │ │ │ │ └── DefaultTest2.java │ │ │ └── rule3 │ │ │ │ └── DefaultTest3.java │ │ ├── functionalinterfaces │ │ │ └── DemoFI.java │ │ ├── methodreferences │ │ │ ├── CollectionStreams.java │ │ │ ├── DemoInstanceMethodReferenceObject.java │ │ │ ├── DemoInstanceMethodReferenceType.java │ │ │ ├── DemoStaticMethodReference.java │ │ │ ├── Studi.java │ │ │ ├── Teaser.java │ │ │ └── ThreadStarter.java │ │ ├── nested │ │ │ ├── DemoAnonymousInnerClass.java │ │ │ ├── DemoComparator.java │ │ │ ├── DemoFunctionalInterface.java │ │ │ ├── DemoLambda.java │ │ │ ├── Outer.java │ │ │ ├── Studi.java │ │ │ ├── StudiListNested.java │ │ │ └── Wuppie.java │ │ ├── optional │ │ │ ├── streams │ │ │ │ ├── Demo.java │ │ │ │ ├── LSF.java │ │ │ │ └── Studi.java │ │ │ ├── teaser │ │ │ │ ├── Demo.java │ │ │ │ ├── LSF.java │ │ │ │ └── Studi.java │ │ │ └── traditional │ │ │ │ ├── Demo.java │ │ │ │ ├── LSF.java │ │ │ │ └── Studi.java │ │ ├── records │ │ │ ├── DemoRecords.java │ │ │ ├── Studi.java │ │ │ ├── StudiR.java │ │ │ ├── StudiS.java │ │ │ └── StudiT.java │ │ └── streams │ │ │ ├── Demo.java │ │ │ ├── Fachbereich.java │ │ │ ├── LSF.java │ │ │ ├── Studi.java │ │ │ └── Studiengang.java │ └── stream-api.md ├── misc │ ├── dungeon.md │ ├── images │ │ ├── checklisteMotivation.png │ │ ├── checklisteMotivationFarbig.png │ │ ├── frameworkVSlib.uxf │ │ ├── frameworksVSlib.png │ │ ├── screenshot_dungeon_clone.png │ │ ├── screenshot_dungeon_defaultlevel.png │ │ ├── screenshot_dungeon_import_intellij.png │ │ ├── screenshot_dungeon_import_intellij_asgradle.png │ │ └── screenshot_dungeon_intellij_gradle.png │ ├── intro-frameworks.md │ ├── readme.md │ └── src │ │ ├── dungeon │ │ ├── demo │ │ │ ├── Main.java │ │ │ ├── WalkerComponent.java │ │ │ └── WalkerSystem.java │ │ └── notes.txt │ │ └── javalin │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ └── main │ │ └── java │ │ ├── JavalinHelloWorld.java │ │ └── JavalinRandomNumber.java ├── pattern │ ├── command.md │ ├── factory-method.md │ ├── flyweight.md │ ├── images │ │ ├── command.drawio │ │ ├── command.png │ │ ├── composite.drawio │ │ ├── composite.png │ │ ├── factorymethod.png │ │ ├── factorymethod.uxf │ │ ├── flyweight.drawio │ │ ├── flyweight.png │ │ ├── hunde.png │ │ ├── hunde.uxf │ │ ├── hunde_strat.png │ │ ├── hunde_strat.uxf │ │ ├── lsf.png │ │ ├── lsf.uxf │ │ ├── observer.png │ │ ├── observer.uxf │ │ ├── observerexample.png │ │ ├── observerexample.uxf │ │ ├── parsetree.png │ │ ├── parsetree_classes_uml.drawio │ │ ├── parsetree_classes_uml.png │ │ ├── parsetree_eval_print_uml.drawio │ │ ├── parsetree_eval_print_uml.png │ │ ├── parsetree_eval_uml.drawio │ │ ├── parsetree_eval_uml.png │ │ ├── parsetree_visitor_uml.drawio │ │ ├── parsetree_visitor_uml.png │ │ ├── template-method.drawio │ │ ├── template-method.png │ │ ├── translator.png │ │ ├── translator.uxf │ │ ├── visitor.drawio │ │ └── visitor.png │ ├── observer.md │ ├── readme.md │ ├── singleton.md │ ├── src │ │ ├── challenges │ │ │ ├── command │ │ │ │ ├── Cursor.java │ │ │ │ ├── Direction.java │ │ │ │ ├── Dwarf.java │ │ │ │ ├── Key.java │ │ │ │ └── Position.java │ │ │ ├── flyweight │ │ │ │ ├── Brett.java │ │ │ │ ├── Figur.java │ │ │ │ ├── Main.java │ │ │ │ ├── Position.java │ │ │ │ └── Typ.java │ │ │ ├── observer │ │ │ │ ├── Auftrag.java │ │ │ │ ├── Einzelhandel.java │ │ │ │ ├── Grosshandel.java │ │ │ │ ├── Main.java │ │ │ │ └── WarenTyp.java │ │ │ └── visitor │ │ │ │ ├── BinaryNode.java │ │ │ │ ├── Main.java │ │ │ │ ├── Node.java │ │ │ │ ├── NodeVisitor.java │ │ │ │ └── UnaryNode.java │ │ ├── command │ │ │ ├── sketch │ │ │ │ ├── Buttons.java │ │ │ │ ├── Command.java │ │ │ │ ├── Entity.java │ │ │ │ ├── Hero.java │ │ │ │ ├── InputHandler.java │ │ │ │ ├── InputHandler2.java │ │ │ │ └── Jump.java │ │ │ └── undo │ │ │ │ ├── Buttons.java │ │ │ │ ├── Command.java │ │ │ │ ├── Entity.java │ │ │ │ ├── Hero.java │ │ │ │ ├── InputHandler3.java │ │ │ │ ├── Jump.java │ │ │ │ └── Move.java │ │ ├── factory │ │ │ └── FactoryBeispiel.java │ │ ├── observer │ │ │ ├── LSF.java │ │ │ ├── Lecturer.java │ │ │ ├── Observer.java │ │ │ ├── ObserverBeispiel.java │ │ │ ├── Person.java │ │ │ ├── Student.java │ │ │ └── Tutor.java │ │ ├── singleton │ │ │ ├── SingletonEager.java │ │ │ └── SingletonLazy.java │ │ ├── strategy │ │ │ ├── SortDefault.java │ │ │ ├── SortOwnCrit.java │ │ │ ├── Studi.java │ │ │ └── TranslatorExample.java │ │ └── visitor │ │ │ ├── direct │ │ │ ├── AddExpr.java │ │ │ ├── DemoExpr.java │ │ │ ├── Expr.java │ │ │ ├── MulExpr.java │ │ │ └── NumExpr.java │ │ │ └── visit │ │ │ ├── extrav │ │ │ ├── AddExpr.java │ │ │ ├── DemoExpr.java │ │ │ ├── EvalVisitor.java │ │ │ ├── Expr.java │ │ │ ├── ExprVisitor.java │ │ │ ├── MulExpr.java │ │ │ ├── NumExpr.java │ │ │ └── PrintVisitor.java │ │ │ └── intrav │ │ │ ├── AddExpr.java │ │ │ ├── DemoExpr.java │ │ │ ├── EvalVisitor.java │ │ │ ├── Expr.java │ │ │ ├── ExprVisitor.java │ │ │ ├── MulExpr.java │ │ │ ├── NumExpr.java │ │ │ └── PrintVisitor.java │ ├── strategy.md │ ├── template-method.md │ ├── type-object.md │ └── visitor.md ├── quality │ ├── codingrules.md │ ├── images │ │ ├── aequivalenzklassen.odg │ │ ├── aequivalenzklassen.png │ │ ├── grenzwerte.png │ │ ├── junitErgebnis.png │ │ ├── junitIgnore.png │ │ ├── logging.png │ │ ├── newJUnit.png │ │ ├── swfehler.png │ │ ├── tdd.odg │ │ └── tdd.png │ ├── javadoc.md │ ├── junit-basics.md │ ├── logging.md │ ├── mockito.md │ ├── readme.md │ ├── refactoring.md │ ├── smells.md │ ├── src │ │ ├── challenges │ │ │ └── refactor │ │ │ │ ├── Article.java │ │ │ │ ├── Bike.java │ │ │ │ ├── Bill.java │ │ │ │ ├── Brompton.java │ │ │ │ ├── EBike.java │ │ │ │ └── Mountainbike.java │ │ ├── checkstyle.xml │ │ ├── checkstyle │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── checkstyle.xml │ │ │ ├── gradle │ │ │ │ └── wrapper │ │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ │ └── gradle-wrapper.properties │ │ │ ├── gradlew │ │ │ ├── gradlew.bat │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── wuppie │ │ │ │ └── deeplearning │ │ │ │ └── strategy │ │ │ │ └── MyWuppieStudi.java │ │ ├── formatter │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── gradle.properties │ │ │ ├── gradle │ │ │ │ └── wrapper │ │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ │ └── gradle-wrapper.properties │ │ │ ├── gradlew │ │ │ ├── gradlew.bat │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── wuppie │ │ │ │ └── deeplearning │ │ │ │ └── strategy │ │ │ │ ├── MyWuppieStudi.java │ │ │ │ └── MyWuppieStudi.java_orig │ │ ├── junit4 │ │ │ ├── MyTestSuite4.java │ │ │ ├── Studi.java │ │ │ ├── Sum.java │ │ │ ├── SumTestConstructor.java │ │ │ ├── SumTestParameters.java │ │ │ ├── Test4.java │ │ │ └── TestAssume.java │ │ ├── junit5 │ │ │ ├── MyTestSuite5.java │ │ │ ├── Test5.java │ │ │ ├── TestMethodSource.java │ │ │ └── TestValueSource.java │ │ ├── logging │ │ │ ├── LoggingDemo.java │ │ │ ├── LoggingHandler.java │ │ │ ├── LoggingLevel.java │ │ │ ├── LoggingParent.java │ │ │ └── MyFormatter.java │ │ ├── mockito │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── checkstyle.xml │ │ │ ├── gradle.properties │ │ │ ├── gradle │ │ │ │ └── wrapper │ │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ │ └── gradle-wrapper.properties │ │ │ ├── gradlew │ │ │ ├── gradlew.bat │ │ │ └── src │ │ │ │ ├── main │ │ │ │ └── java │ │ │ │ │ ├── hsbi │ │ │ │ │ ├── LSF.java │ │ │ │ │ └── Studi.java │ │ │ │ │ └── wuppie │ │ │ │ │ ├── mock │ │ │ │ │ ├── IWuppiWarenlager.java │ │ │ │ │ └── WuppiStore.java │ │ │ │ │ ├── spy │ │ │ │ │ ├── IWuppiWarenlager.java │ │ │ │ │ ├── Wuppi.java │ │ │ │ │ ├── WuppiStore.java │ │ │ │ │ └── WuppiWarenlager.java │ │ │ │ │ ├── stub │ │ │ │ │ ├── IWuppiWarenlager.java │ │ │ │ │ ├── WuppiStore.java │ │ │ │ │ └── WuppiWarenlagerStub.java │ │ │ │ │ └── verify │ │ │ │ │ └── FluppisListe.java │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ ├── hsbi │ │ │ │ ├── MatcherTest.java │ │ │ │ ├── StudiMockTest.java │ │ │ │ ├── StudiSpyTest.java │ │ │ │ ├── StudiStubTest.java │ │ │ │ └── VerifyTest.java │ │ │ │ └── wuppie │ │ │ │ ├── mock │ │ │ │ └── WuppiWarenlagerMockTest.java │ │ │ │ ├── spy │ │ │ │ └── WuppiWarenlagerSpyTest.java │ │ │ │ ├── stub │ │ │ │ └── WuppiWarenlagerStubTest.java │ │ │ │ └── verify │ │ │ │ └── VerifyFluppisListeTest.java │ │ ├── refactoring │ │ │ ├── Kurs.java │ │ │ ├── KursTest.java │ │ │ ├── Person.java │ │ │ ├── PersonTest.java │ │ │ ├── Studi.java │ │ │ └── StudiTest.java │ │ ├── spotbugs │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── gradle │ │ │ │ └── wrapper │ │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ │ └── gradle-wrapper.properties │ │ │ ├── gradlew │ │ │ ├── gradlew.bat │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── wuppie │ │ │ │ └── deeplearning │ │ │ │ └── strategy │ │ │ │ └── MyWuppieStudi.java │ │ └── tdd │ │ │ ├── PasswordChecker.java │ │ │ ├── PasswordCheckerTest.java │ │ │ └── anforderungen.md │ ├── tdd.md │ ├── testcases.md │ └── testing-intro.md └── readme.md ├── metadata.yml ├── pm.bib ├── pm.yaml └── readme.md /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 4 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [Makefile] 13 | indent_style = tab 14 | 15 | [{*.sh, gradlew}] 16 | end_of_line = lf 17 | 18 | [{*.bat, *.cmd}] 19 | end_of_line = crlf 20 | 21 | [{*.hs, *.yaml}] 22 | indent_style = space 23 | indent_size = 2 24 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | *.cmd text eol=crlf 4 | *.bat text eol=crlf 5 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @cagix 2 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | -------------------------------------------------------------------------------- /.github/workflows/beamer.yaml: -------------------------------------------------------------------------------- 1 | name: Beamer Slides 2 | 3 | on: 4 | # push on master branch 5 | push: 6 | branches: [master] 7 | # triggered manually 8 | workflow_dispatch: 9 | 10 | jobs: 11 | beamer: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | with: 16 | fetch-depth: 0 17 | - uses: cagix/pandoc-lecture-zen@master 18 | with: 19 | mktarget: beamer 20 | pandoc_data: .pandoc 21 | metadata: pm.yaml 22 | publish_dir: _beamer 23 | - uses: peaceiris/actions-gh-pages@v4 24 | with: 25 | github_token: ${{ secrets.GITHUB_TOKEN }} 26 | publish_dir: _beamer 27 | publish_branch: _beamer 28 | force_orphan: true 29 | -------------------------------------------------------------------------------- /.github/workflows/docsify.yaml: -------------------------------------------------------------------------------- 1 | name: Docsify Preview 2 | 3 | on: 4 | # push on master branch 5 | push: 6 | branches: [master] 7 | # triggered manually 8 | workflow_dispatch: 9 | 10 | jobs: 11 | docsify: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | with: 16 | fetch-depth: 0 17 | - uses: cagix/pandoc-lecture-zen@master 18 | with: 19 | mktarget: docsify 20 | pandoc_data: .pandoc 21 | metadata: pm.yaml 22 | publish_dir: _docsify 23 | - uses: peaceiris/actions-gh-pages@v4 24 | with: 25 | github_token: ${{ secrets.GITHUB_TOKEN }} 26 | publish_dir: _docsify 27 | publish_branch: _docsify 28 | force_orphan: true 29 | -------------------------------------------------------------------------------- /.github/workflows/gfm.yaml: -------------------------------------------------------------------------------- 1 | name: GitHub Preview 2 | 3 | on: 4 | # push on master branch 5 | push: 6 | branches: [master] 7 | # triggered manually 8 | workflow_dispatch: 9 | 10 | jobs: 11 | gfm: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | with: 16 | fetch-depth: 0 17 | - uses: cagix/pandoc-lecture-zen@master 18 | with: 19 | mktarget: gfm 20 | pandoc_data: .pandoc 21 | metadata: pm.yaml 22 | publish_dir: _gfm 23 | - uses: peaceiris/actions-gh-pages@v4 24 | with: 25 | github_token: ${{ secrets.GITHUB_TOKEN }} 26 | publish_dir: _gfm 27 | publish_branch: _gfm 28 | force_orphan: true 29 | -------------------------------------------------------------------------------- /.github/workflows/pdf.yaml: -------------------------------------------------------------------------------- 1 | name: PDF Handout 2 | 3 | on: 4 | # push on master branch 5 | push: 6 | branches: [master] 7 | # triggered manually 8 | workflow_dispatch: 9 | 10 | jobs: 11 | pdf: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | with: 16 | fetch-depth: 0 17 | - uses: cagix/pandoc-lecture-zen@master 18 | with: 19 | mktarget: pdf 20 | pandoc_data: .pandoc 21 | metadata: pm.yaml 22 | publish_dir: _pdf 23 | - uses: peaceiris/actions-gh-pages@v4 24 | with: 25 | github_token: ${{ secrets.GITHUB_TOKEN }} 26 | publish_dir: _pdf 27 | publish_branch: _pdf 28 | force_orphan: true 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # IDE generated files # 2 | ###################### 3 | .vscode/ 4 | .idea/ 5 | *.iml 6 | .project 7 | .metadata 8 | .settings/ 9 | .externalToolBuilders/ 10 | .classpath 11 | 12 | 13 | # Temporary files # 14 | ################### 15 | *~ 16 | *.swp 17 | *.tmp 18 | *.bak 19 | .DS_Store 20 | ._* 21 | 22 | 23 | # Temporary directory # 24 | ####################### 25 | tmp/ 26 | temp/ 27 | resources/ 28 | docs/ 29 | pdf/ 30 | 31 | 32 | # Hugo / Pandoc related files # 33 | ############################### 34 | .hugo_build.lock 35 | local.yaml 36 | /data/readings.yaml 37 | .pandoc 38 | make.deps 39 | _gfm 40 | _docsify 41 | _pdf 42 | _beamer 43 | 44 | 45 | # JAVA, Scala # 46 | ############### 47 | *.class 48 | *.log 49 | *.jar 50 | hs_err_pid* 51 | replay_pid* 52 | *.hprof 53 | **/build/ 54 | **/bin/ 55 | **/out/ 56 | **/target/ 57 | .gradle/ 58 | # don't ignore any gradle wrapper files 59 | !gradle/ 60 | 61 | 62 | # Packages # 63 | ############ 64 | *.dmg 65 | *.iso 66 | *.rar 67 | *.zip 68 | *.tgz 69 | *.tar.gz 70 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/.gitmodules -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/.nojekyll -------------------------------------------------------------------------------- /CITATION.cff: -------------------------------------------------------------------------------- 1 | # This CITATION.cff file was generated with cffinit. 2 | # Visit https://bit.ly/cffinit to generate yours today! 3 | 4 | cff-version: 1.2.0 5 | title: Lecture "Programmieren 2" 6 | message: >- 7 | If you use this lecture material, please cite it using the 8 | metadata from this file. 9 | type: software 10 | authors: 11 | - given-names: Carsten 12 | family-names: Gips 13 | email: cagix@hsbi.de 14 | affiliation: HSBI 15 | orcid: 'https://orcid.org/0000-0002-4230-9060' 16 | repository-code: >- 17 | https://github.com/Programmiermethoden-CampusMinden/Prog2-Lecture 18 | abstract: >- 19 | This represents the lecture material for the lecture 20 | "Programmieren 2" (formerly known as 21 | "Programmiermethoden"), a course developed and taught at 22 | Bielefeld University of Applied Sciences. 23 | keywords: 24 | - java 25 | - git 26 | - refactoring 27 | - testing 28 | - clean code 29 | - oer 30 | license: CC-BY-SA-4.0 31 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ## Source files of our project 2 | METADATA ?= pm.yaml 3 | OUTPUT_DIR ?= _gfm 4 | 5 | ## Folder to contain the Pandoc-Lecture-Zen project tooling 6 | PANDOC_DATA ?= .pandoc 7 | 8 | 9 | ## Update Pandoc-Lecture-Zen dependency 10 | update_tooling: $(PANDOC_DATA) 11 | cd $(PANDOC_DATA) && git switch master && git pull 12 | 13 | $(PANDOC_DATA): 14 | git clone git@github.com:cagix/pandoc-lecture-zen.git $(PANDOC_DATA) 15 | 16 | 17 | ## Include targets from Pandoc-Lecture-Zen Makefile 18 | -include $(PANDOC_DATA)/Makefile 19 | 20 | 21 | ## Declaration of phony targets 22 | .PHONY: update_tooling 23 | -------------------------------------------------------------------------------- /admin/images/fahrplan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/admin/images/fahrplan.png -------------------------------------------------------------------------------- /admin/planung_pm.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/admin/planung_pm.xlsx -------------------------------------------------------------------------------- /admin/readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Organisatorisches" 3 | no_pdf: true 4 | no_beamer: true 5 | --- 6 | -------------------------------------------------------------------------------- /homework/images/bridgetroll-annot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/homework/images/bridgetroll-annot.png -------------------------------------------------------------------------------- /homework/images/bridgetroll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/homework/images/bridgetroll.png -------------------------------------------------------------------------------- /homework/readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Praktikum" 3 | no_pdf: true 4 | no_beamer: true 5 | --- 6 | 7 | 8 | Hier finden Sie die Übungsblätter. 9 | -------------------------------------------------------------------------------- /lecture/building/images/ci.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/ci.png -------------------------------------------------------------------------------- /lecture/building/images/screenshot-githubci-job.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/screenshot-githubci-job.png -------------------------------------------------------------------------------- /lecture/building/images/screenshot-githubci-triggeredworkflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/screenshot-githubci-triggeredworkflow.png -------------------------------------------------------------------------------- /lecture/building/images/screenshot-githubci-workflows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/screenshot-githubci-workflows.png -------------------------------------------------------------------------------- /lecture/building/images/screenshot-gitlabci-job.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/screenshot-gitlabci-job.png -------------------------------------------------------------------------------- /lecture/building/images/screenshot-gitlabci-pipelines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/screenshot-gitlabci-pipelines.png -------------------------------------------------------------------------------- /lecture/building/images/screenshot-gitlabci-triggeredpipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/screenshot-gitlabci-triggeredpipeline.png -------------------------------------------------------------------------------- /lecture/building/images/screenshot_github_actions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/screenshot_github_actions.png -------------------------------------------------------------------------------- /lecture/building/images/screenshot_github_settings_actions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/screenshot_github_settings_actions.png -------------------------------------------------------------------------------- /lecture/building/images/screenshot_github_settings_permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/screenshot_github_settings_permissions.png -------------------------------------------------------------------------------- /lecture/building/images/screenshot_maven-lifecycle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/screenshot_maven-lifecycle.png -------------------------------------------------------------------------------- /lecture/building/images/screenshot_maven-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/screenshot_maven-project.png -------------------------------------------------------------------------------- /lecture/building/images/virtualisierung.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/virtualisierung.png -------------------------------------------------------------------------------- /lecture/building/images/vscode-remote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/building/images/vscode-remote.png -------------------------------------------------------------------------------- /lecture/building/readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Bauen von Programmen, Automatisierung, Continuous Integration" 3 | no_pdf: true 4 | no_beamer: true 5 | --- 6 | -------------------------------------------------------------------------------- /lecture/building/src/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:latest 2 | 3 | ENV DEBIAN_FRONTEND noninteractive 4 | RUN apt-get -q --no-allow-insecure-repositories update \ 5 | && apt-get install --assume-yes --no-install-recommends \ 6 | openjdk-17-jdk \ 7 | maven \ 8 | ant \ 9 | ivy \ 10 | && rm -rf /var/lib/apt/lists/* 11 | 12 | ENTRYPOINT ["sh", "-c"] 13 | -------------------------------------------------------------------------------- /lecture/building/src/Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: all 2 | all: Dockerfile 3 | docker build -t ubuntu-ant-maven -f Dockerfile . 4 | 5 | .PHONY: clean 6 | clean: 7 | -docker rmi ubuntu-ant-maven 8 | 9 | .PHONY: run 10 | run: 11 | docker run --rm -it -v "$(shell pwd):/data" -w "/data" -u "$(shell id -u):$(shell id -g)" --entrypoint "bash" ubuntu-ant-maven 12 | 13 | .PHONY: run_as_root 14 | run_as_root: 15 | docker run --rm -it -v "$(shell pwd):/data" -w "/data" --entrypoint "bash" ubuntu-ant-maven 16 | -------------------------------------------------------------------------------- /lecture/building/src/ant/Hello.java: -------------------------------------------------------------------------------- 1 | /** Demo für Ant */ 2 | public class Hello { 3 | /** Hier gibt's nix zu sehen, gehen Sie weiter :) */ 4 | public static void main(String[] argv) { 5 | System.out.println("Hello World :-)"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lecture/building/src/ant/hello.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /lecture/building/src/ant/ivy.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /lecture/building/src/ant/ivydemo.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /lecture/building/src/docker/.github/workflows/demo.yml: -------------------------------------------------------------------------------- 1 | name: demo 2 | on: 3 | push: 4 | branches: [master] 5 | workflow_dispatch: 6 | 7 | jobs: 8 | job1: 9 | runs-on: ubuntu-latest 10 | container: docker://openjdk:17 11 | steps: 12 | - uses: actions/checkout@v4 13 | - run: java -version 14 | - run: javac Hello.java 15 | - run: java Hello 16 | - run: ls -lags 17 | -------------------------------------------------------------------------------- /lecture/building/src/docker/.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | default: 2 | image: openjdk:17 3 | 4 | job1: 5 | stage: build 6 | script: 7 | - java -version 8 | - javac Hello.java 9 | - java Hello 10 | - ls -lags 11 | -------------------------------------------------------------------------------- /lecture/building/src/docker/Hello.java: -------------------------------------------------------------------------------- 1 | /** Demo für Docker */ 2 | public class Hello { 3 | /** Hier gibt's nix zu sehen, gehen Sie weiter :) */ 4 | public static void main(String[] argv) { 5 | System.out.println("Hello World :-)"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lecture/building/src/docker/debian-latex.df: -------------------------------------------------------------------------------- 1 | FROM debian:stable-slim 2 | 3 | ARG USERNAME=pandoc 4 | ARG USER_UID=1000 5 | ARG USER_GID=1000 6 | 7 | RUN apt-get update && apt-get install -y --no-install-recommends \ 8 | apt-utils bash wget make graphviz biber \ 9 | texlive-base texlive-plain-generic texlive-latex-base \ 10 | # 11 | && groupadd --gid $USER_GID $USERNAME \ 12 | && useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \ 13 | # 14 | && apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/* 15 | 16 | WORKDIR /pandoc 17 | USER $USERNAME 18 | -------------------------------------------------------------------------------- /lecture/building/src/maven/Hello.java: -------------------------------------------------------------------------------- 1 | /** Demo für Maven */ 2 | public class Hello { 3 | /** Hier gibt's nix zu sehen, gehen Sie weiter :) */ 4 | public static void main(String[] argv) { 5 | System.out.println("Hello World :-)"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lecture/git/images/after.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/after.png -------------------------------------------------------------------------------- /lecture/git/images/before.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/before.png -------------------------------------------------------------------------------- /lecture/git/images/centralised.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/centralised.png -------------------------------------------------------------------------------- /lecture/git/images/distributed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/distributed.png -------------------------------------------------------------------------------- /lecture/git/images/lifecycle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/lifecycle.png -------------------------------------------------------------------------------- /lecture/git/images/linkedworktrees.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/linkedworktrees.png -------------------------------------------------------------------------------- /lecture/git/images/local.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/local.png -------------------------------------------------------------------------------- /lecture/git/images/remote-branches-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/remote-branches-2.png -------------------------------------------------------------------------------- /lecture/git/images/screenshot_branches.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/screenshot_branches.png -------------------------------------------------------------------------------- /lecture/git/images/screenshot_git_log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/screenshot_git_log.png -------------------------------------------------------------------------------- /lecture/git/images/screenshot_git_log_recent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/screenshot_git_log_recent.png -------------------------------------------------------------------------------- /lecture/git/images/screenshot_merge-request_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/screenshot_merge-request_code.png -------------------------------------------------------------------------------- /lecture/git/images/screenshot_merge-request_discussion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/screenshot_merge-request_discussion.png -------------------------------------------------------------------------------- /lecture/git/images/screenshot_zusammenarbeit_ohne_vcs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/screenshot_zusammenarbeit_ohne_vcs.png -------------------------------------------------------------------------------- /lecture/git/images/workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/workflow.png -------------------------------------------------------------------------------- /lecture/git/images/workflow_remote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/git/images/workflow_remote.png -------------------------------------------------------------------------------- /lecture/git/readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Versionierung mit Git" 3 | no_pdf: true 4 | no_beamer: true 5 | --- 6 | -------------------------------------------------------------------------------- /lecture/gui/images/ActionListener.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/gui/images/ActionListener.png -------------------------------------------------------------------------------- /lecture/gui/images/EventListener.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/gui/images/EventListener.png -------------------------------------------------------------------------------- /lecture/gui/images/EventObject.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/gui/images/EventObject.png -------------------------------------------------------------------------------- /lecture/gui/images/java2d-koordinaten.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/gui/images/java2d-koordinaten.png -------------------------------------------------------------------------------- /lecture/gui/images/java2d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/gui/images/java2d.png -------------------------------------------------------------------------------- /lecture/gui/images/mvc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/gui/images/mvc.png -------------------------------------------------------------------------------- /lecture/gui/images/observer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/gui/images/observer.png -------------------------------------------------------------------------------- /lecture/gui/images/screenshot-borderlayout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/gui/images/screenshot-borderlayout.png -------------------------------------------------------------------------------- /lecture/gui/images/screenshot-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/gui/images/screenshot-dialog.png -------------------------------------------------------------------------------- /lecture/gui/images/screenshot-filechooser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/gui/images/screenshot-filechooser.png -------------------------------------------------------------------------------- /lecture/gui/images/screenshot-flowlayout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/gui/images/screenshot-flowlayout.png -------------------------------------------------------------------------------- /lecture/gui/images/screenshot-gridlayout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/gui/images/screenshot-gridlayout.png -------------------------------------------------------------------------------- /lecture/gui/images/screenshot-radiobuttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/gui/images/screenshot-radiobuttons.png -------------------------------------------------------------------------------- /lecture/gui/readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Graphische Oberflächen mit Swing und Java2D" 3 | no_pdf: true 4 | no_beamer: true 5 | --- 6 | -------------------------------------------------------------------------------- /lecture/gui/src/basics/FirstWindow.java: -------------------------------------------------------------------------------- 1 | package basics; 2 | 3 | import javax.swing.JFrame; 4 | import javax.swing.SwingUtilities; 5 | 6 | /** Erzeuge ein minimales Fenster */ 7 | public final class FirstWindow { 8 | /** Erzeuge die Komponenten in neuem EDT-Job statt im main()-Tread */ 9 | public static void main(String[] args) { 10 | SwingUtilities.invokeLater( 11 | new Runnable() { 12 | public void run() { 13 | JFrame frame = new JFrame("Hello World :)"); 14 | 15 | frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 16 | 17 | frame.pack(); 18 | frame.setVisible(true); 19 | } 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lecture/gui/src/challenges/tictactoe/Gamestate.java: -------------------------------------------------------------------------------- 1 | package challenges.tictactoe; 2 | 3 | /** Possible states of the game */ 4 | public enum Gamestate { 5 | CONTINUE, 6 | PLAYER1_WON, 7 | PLAYER2_WON, 8 | TIE; 9 | } 10 | -------------------------------------------------------------------------------- /lecture/gui/src/challenges/tictactoe/Icon.java: -------------------------------------------------------------------------------- 1 | package challenges.tictactoe; 2 | 3 | /** The Icon a player draws on the board */ 4 | public enum Icon { 5 | PLAYER_ONE("X"), 6 | PLAYER_TWO("O"), 7 | EMPTY(""); 8 | 9 | private final String text; 10 | 11 | Icon(final String text) { 12 | this.text = text; 13 | } 14 | 15 | @Override 16 | public String toString() { 17 | return text; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lecture/gui/src/challenges/tictactoe/Player.java: -------------------------------------------------------------------------------- 1 | package challenges.tictactoe; 2 | 3 | public class Player { 4 | private final String name; 5 | private final Icon icon; 6 | private int points = 0; 7 | 8 | /** 9 | * Create a Player 10 | * 11 | * @param name Name of the Player 12 | * @param icon Icon of the Player (X,O) 13 | */ 14 | public Player(final String name, final Icon icon) { 15 | this.name = name; 16 | this.icon = icon; 17 | } 18 | 19 | public Icon getIcon() { 20 | return icon; 21 | } 22 | 23 | public void incrPoint() { 24 | points++; 25 | } 26 | 27 | public String getName() { 28 | return name; 29 | } 30 | 31 | public int getPoints() { 32 | return points; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lecture/gui/src/events/DemoStarter.java: -------------------------------------------------------------------------------- 1 | package events; 2 | 3 | import javax.swing.JFrame; 4 | import javax.swing.SwingUtilities; 5 | 6 | /** Rahmen für die Listener-Demos */ 7 | public final class DemoStarter { 8 | /** Erzeuge die Komponenten in neuem EDT-Job statt im main()-Tread */ 9 | public static void main(String[] args) { 10 | SwingUtilities.invokeLater( 11 | new Runnable() { 12 | public void run() { 13 | JFrame frame = new JFrame("Listener Demo"); 14 | frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 15 | 16 | frame.add(new MouseListenerDemo()); 17 | // frame.add(new MouseAdapterDemo()); 18 | // frame.add(new ListenerDemo()); 19 | 20 | frame.pack(); 21 | frame.setSize(480, 460); 22 | frame.setVisible(true); 23 | } 24 | }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lecture/gui/src/java2d/DemoStarter.java: -------------------------------------------------------------------------------- 1 | package java2d; 2 | 3 | import java2d.simplegame.J2DTeaser; 4 | import javax.swing.JFrame; 5 | import javax.swing.SwingUtilities; 6 | 7 | /** Rahmen für die Java2D-Demos */ 8 | public final class DemoStarter { 9 | /** Erzeuge die Komponenten in neuem EDT-Job statt im main()-Tread */ 10 | public static void main(String[] args) { 11 | SwingUtilities.invokeLater( 12 | new Runnable() { 13 | public void run() { 14 | JFrame frame = new JFrame("Java2D Demo"); 15 | frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 16 | 17 | frame.add(J2DTeaser.newJ2DTeaser()); 18 | // frame.add(SimpleDrawings.newDrawings()); 19 | // frame.add(SimpleFonts.newWritings()); 20 | // frame.add(SimplePoly.newDrawings()); 21 | 22 | frame.pack(); 23 | frame.setSize(480, 460); 24 | frame.setVisible(true); 25 | } 26 | }); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lecture/gui/src/java2d/SimpleDrawings.java: -------------------------------------------------------------------------------- 1 | package java2d; 2 | 3 | import java.awt.Color; 4 | import java.awt.Graphics; 5 | import javax.swing.JPanel; 6 | 7 | /** Demo: Umgang mit einfachen geometrischen Formen */ 8 | public final class SimpleDrawings { 9 | /** Zeichne einfache Objekte auf einem JPanel */ 10 | public static JPanel newDrawings() { 11 | return new JPanel() { 12 | @Override 13 | public void paintComponent(Graphics g) { 14 | super.paintComponent(g); 15 | 16 | setBackground(Color.WHITE); 17 | 18 | g.setColor(Color.RED); 19 | g.drawLine(100, 20, 380, 20); 20 | 21 | g.setColor(Color.BLUE); 22 | g.drawRect(100, 40, 280, 80); 23 | g.fillRect(100, 130, 280, 80); 24 | 25 | g.setColor(Color.GREEN); 26 | g.drawOval(100, 220, 280, 80); 27 | g.fillOval(100, 310, 280, 80); 28 | } 29 | }; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lecture/gui/src/java2d/SimpleFonts.java: -------------------------------------------------------------------------------- 1 | package java2d; 2 | 3 | import java.awt.Color; 4 | import java.awt.Font; 5 | import java.awt.Graphics; 6 | import javax.swing.JPanel; 7 | 8 | /** Demo: Umgang mit Fonts */ 9 | public final class SimpleFonts { 10 | /** Formatiere Zeichenketten auf einem JPanel */ 11 | public static JPanel newWritings() { 12 | return new JPanel() { 13 | @Override 14 | public void paintComponent(Graphics g) { 15 | super.paintComponent(g); 16 | setBackground(Color.WHITE); 17 | 18 | g.setFont(new Font("Serif", Font.BOLD, 12)); 19 | g.drawString("Serif, 12pt, fett", 20, 30); 20 | 21 | g.setFont(new Font("Monospaced", Font.ITALIC, 18)); 22 | g.drawString("Mono, 18pt, schraeg", 20, 60); 23 | 24 | g.setColor(Color.RED); 25 | g.setFont(new Font("SansSerif", Font.BOLD + Font.ITALIC, 24)); 26 | g.drawString("SansSerif, 24pt, fett und schraeg", 20, 90); 27 | } 28 | }; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lecture/gui/src/java2d/simplegame/GameOval.java: -------------------------------------------------------------------------------- 1 | package java2d.simplegame; 2 | 3 | import java.awt.Color; 4 | import java.awt.Graphics; 5 | 6 | /** Ovales Game-Objekt in grün */ 7 | public class GameOval extends GameObject { 8 | /** 9 | * Initialisiere Game-Oval 10 | * 11 | * @param x x-Position 12 | * @param y y-Position 13 | * @param deltaX verschiebe Objekt pro Schritt um diese Distanz entlang der x-Achse 14 | */ 15 | public GameOval(int x, int y, int deltaX) { 16 | super(x, y, deltaX); 17 | } 18 | 19 | /** Zeichne ein grünes Oval */ 20 | @Override 21 | public void draw(Graphics g) { 22 | g.setColor(Color.GREEN); 23 | g.fillOval(x, y, 80, 80); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lecture/gui/src/java2d/simplegame/GameRect.java: -------------------------------------------------------------------------------- 1 | package java2d.simplegame; 2 | 3 | import java.awt.Color; 4 | import java.awt.Graphics; 5 | 6 | /** Rechteckiges Game-Objekt in blau */ 7 | public class GameRect extends GameObject { 8 | /** 9 | * Initialisiere Game-Rechteck 10 | * 11 | * @param x x-Position 12 | * @param y y-Position 13 | * @param deltaX verschiebe Objekt pro Schritt um diese Distanz entlang der x-Achse 14 | */ 15 | public GameRect(int x, int y, int deltaX) { 16 | super(x, y, deltaX); 17 | } 18 | 19 | /** Zeichne ein blaues Rechteck */ 20 | @Override 21 | public void draw(Graphics g) { 22 | g.setColor(Color.BLUE); 23 | g.drawRect(x, y, 80, 80); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lecture/gui/src/layout/Border.java: -------------------------------------------------------------------------------- 1 | package layout; 2 | 3 | import java.awt.BorderLayout; 4 | import javax.swing.JButton; 5 | import javax.swing.JPanel; 6 | 7 | /** Demo: Umgang mit dem BorderLayout */ 8 | public final class Border { 9 | /** Erzeuge ein Panel mit dem BorderLayout */ 10 | public static JPanel newBorder() { 11 | JPanel contentPane = new JPanel(); 12 | BorderLayout bl = new BorderLayout(); 13 | 14 | contentPane.setLayout(bl); 15 | 16 | contentPane.add(new JButton("North"), BorderLayout.NORTH); // also: PAGE_START 17 | contentPane.add(new JButton("West"), BorderLayout.WEST); // also: LINE_START 18 | contentPane.add(new JButton("Center"), BorderLayout.CENTER); 19 | contentPane.add(new JButton("East"), BorderLayout.EAST); // also: LINE_END 20 | contentPane.add(new JButton("South"), BorderLayout.SOUTH); // also: PAGE_END 21 | 22 | // bl.setHgap(20); // setze horizontalen Abstand zw. Komponenten 23 | // bl.setVgap(20); // setze vertikalen Abstand zw. Komponenten 24 | 25 | return contentPane; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lecture/gui/src/layout/DemoStarter.java: -------------------------------------------------------------------------------- 1 | package layout; 2 | 3 | import javax.swing.JFrame; 4 | import javax.swing.SwingUtilities; 5 | 6 | /** Rahmen für die Layout-Demos */ 7 | public final class DemoStarter { 8 | /** Erzeuge die Komponenten in neuem EDT-Job statt im main()-Tread */ 9 | public static void main(String[] args) { 10 | SwingUtilities.invokeLater( 11 | new Runnable() { 12 | public void run() { 13 | JFrame frame = new JFrame("Layout Manager Demo"); 14 | frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 15 | 16 | // frame.add(Border.newBorder()); 17 | // frame.add(Flow.newFlow()); 18 | // frame.add(Grid.newGrid()); 19 | frame.add(GridBag.newGridBag()); 20 | 21 | frame.pack(); 22 | frame.setVisible(true); 23 | } 24 | }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lecture/gui/src/layout/Flow.java: -------------------------------------------------------------------------------- 1 | package layout; 2 | 3 | import java.awt.FlowLayout; 4 | import javax.swing.JButton; 5 | import javax.swing.JPanel; 6 | 7 | /** Demo: Umgang mit dem FlowLayout */ 8 | public final class Flow { 9 | /** Erzeuge ein Panel mit dem FlowLayout */ 10 | public static JPanel newFlow() { 11 | JPanel contentPane = new JPanel(); 12 | FlowLayout fl = new FlowLayout(); 13 | 14 | contentPane.setLayout(fl); 15 | 16 | // fl.setHgap(20); 17 | // fl.setVgap(20); 18 | // fl.setAlignment(FlowLayout.LEFT); 19 | 20 | contentPane.add(new JButton("Label 1")); 21 | contentPane.add(new JButton("Label 2")); 22 | contentPane.add(new JButton("Label 3")); 23 | contentPane.add(new JButton("Label 4")); 24 | contentPane.add(new JButton("Label 5")); 25 | contentPane.add(new JButton("Label 6")); 26 | 27 | return contentPane; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lecture/gui/src/layout/Grid.java: -------------------------------------------------------------------------------- 1 | package layout; 2 | 3 | import java.awt.GridLayout; 4 | import javax.swing.JButton; 5 | import javax.swing.JPanel; 6 | 7 | /** Demo: Umgang mit dem GridLayout */ 8 | public final class Grid { 9 | /** Erzeuge ein Panel mit dem GridLayout */ 10 | public static JPanel newGrid() { 11 | JPanel contentPane = new JPanel(); 12 | GridLayout gl = new GridLayout(2, 3); // 0: any number of rows or columns 13 | 14 | contentPane.setLayout(gl); 15 | 16 | // gl.setHgap(20); 17 | // gl.setVgap(20); 18 | 19 | contentPane.add(new JButton("Label 1")); 20 | contentPane.add(new JButton("Label 2")); 21 | contentPane.add(new JButton("Label 3")); 22 | contentPane.add(new JButton("Label 4")); 23 | contentPane.add(new JButton("Label 5")); 24 | contentPane.add(new JButton("Label 6")); 25 | contentPane.add(new JButton("Label 7")); 26 | 27 | return contentPane; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lecture/gui/src/tables/DemoStarter.java: -------------------------------------------------------------------------------- 1 | package tables; 2 | 3 | import javax.swing.JFrame; 4 | import javax.swing.SwingUtilities; 5 | 6 | /** Rahmen für die Layout-Demos */ 7 | public final class DemoStarter { 8 | /** Erzeuge die Komponenten in neuem EDT-Job statt im main()-Tread */ 9 | public static void main(String[] args) { 10 | SwingUtilities.invokeLater( 11 | new Runnable() { 12 | public void run() { 13 | JFrame frame = new JFrame("Tables Demo"); 14 | frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 15 | 16 | // frame.add(SimpleTable.newSimpleTable()); 17 | // frame.add(SelectTable.newSelectTable()); 18 | frame.add(ModelTable.newModelTable()); 19 | 20 | frame.pack(); 21 | frame.setVisible(true); 22 | } 23 | }); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lecture/gui/src/tables/SimpleTable.java: -------------------------------------------------------------------------------- 1 | package tables; 2 | 3 | import java.awt.BorderLayout; 4 | import javax.swing.JPanel; 5 | import javax.swing.JTable; 6 | 7 | /** Demo: Umgang mit einer einfachen Tabelle */ 8 | public final class SimpleTable { 9 | /** Erzeuge ein Panel mit einer einfachen Tabelle */ 10 | public static JPanel newSimpleTable() { 11 | JPanel contentPane = new JPanel(); 12 | 13 | String[] columns = {"Vorname", "Name", "ECTS", "Semester", "PM bestanden"}; 14 | Object[][] data = { 15 | {"Hein", "Bloed", 5, 2, Boolean.FALSE}, 16 | {"Holger", "Hinz", 15, 4, Boolean.TRUE}, 17 | {"Susi", "Studi", 2, 2, Boolean.FALSE} 18 | }; 19 | 20 | JTable table = new JTable(data, columns); 21 | 22 | contentPane.setLayout(new BorderLayout()); 23 | contentPane.add(table.getTableHeader(), BorderLayout.NORTH); 24 | contentPane.add(table, BorderLayout.CENTER); 25 | 26 | return contentPane; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lecture/java-classic/images/ThreadRunnable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/ThreadRunnable.png -------------------------------------------------------------------------------- /lecture/java-classic/images/arraylist.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/arraylist.gif -------------------------------------------------------------------------------- /lecture/java-classic/images/arraylist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/arraylist.png -------------------------------------------------------------------------------- /lecture/java-classic/images/collection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/collection.png -------------------------------------------------------------------------------- /lecture/java-classic/images/collections.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/collections.png -------------------------------------------------------------------------------- /lecture/java-classic/images/collections.uxf: -------------------------------------------------------------------------------- 1 | 10UMLClass130180320200Collections 2 | -- 3 | -- 4 | addAll(c: Collection<? super T>, elements: T...): boolean 5 | replaceAll(list: List<T>, oldVal: T, newVal: T): boolean 6 | rotate(list: List<?>, distance: int): void 7 | shuffle(list: List<?>): void 8 | sort(list: List<?>, c: Comparator<? super T>): void 9 | swap(list. List<?>, i: int, j: int): void 10 | frequency(c: Collection<?>, o: Object): int 11 | fill(list: List<? super T>, obj: T): void 12 | disjoint(c1: Collection<?>, c2: Collection<?>): boolean 13 | copy(dest: List<? super T>, src: List<? extends T>): void -------------------------------------------------------------------------------- /lecture/java-classic/images/collections_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/collections_table.png -------------------------------------------------------------------------------- /lecture/java-classic/images/collections_table_vorlage.numbers: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/collections_table_vorlage.numbers -------------------------------------------------------------------------------- /lecture/java-classic/images/exception.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/exception.png -------------------------------------------------------------------------------- /lecture/java-classic/images/gif_vorlage/arraylist_vorlage.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/gif_vorlage/arraylist_vorlage.pptx -------------------------------------------------------------------------------- /lecture/java-classic/images/gif_vorlage/iterator_vorlage.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/gif_vorlage/iterator_vorlage.pptx -------------------------------------------------------------------------------- /lecture/java-classic/images/gif_vorlage/linkedlist_vorlage.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/gif_vorlage/linkedlist_vorlage.pptx -------------------------------------------------------------------------------- /lecture/java-classic/images/hashmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/hashmap.png -------------------------------------------------------------------------------- /lecture/java-classic/images/ide-cli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/ide-cli.png -------------------------------------------------------------------------------- /lecture/java-classic/images/iterator.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/iterator.gif -------------------------------------------------------------------------------- /lecture/java-classic/images/iterator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/iterator.png -------------------------------------------------------------------------------- /lecture/java-classic/images/iteratoruml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/iteratoruml.png -------------------------------------------------------------------------------- /lecture/java-classic/images/linkedlist.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/linkedlist.gif -------------------------------------------------------------------------------- /lecture/java-classic/images/linkedlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/linkedlist.png -------------------------------------------------------------------------------- /lecture/java-classic/images/map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/map.png -------------------------------------------------------------------------------- /lecture/java-classic/images/screenshot_infer-notnull.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/screenshot_infer-notnull.png -------------------------------------------------------------------------------- /lecture/java-classic/images/screenshot_nullpointerexception-notnull.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/screenshot_nullpointerexception-notnull.png -------------------------------------------------------------------------------- /lecture/java-classic/images/screenshot_swingworker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/screenshot_swingworker.png -------------------------------------------------------------------------------- /lecture/java-classic/images/uml_serialisierung.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-classic/images/uml_serialisierung.png -------------------------------------------------------------------------------- /lecture/java-classic/readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Fortgeschrittene Java-Themen und Umgang mit JVM" 3 | no_pdf: true 4 | no_beamer: true 5 | --- 6 | -------------------------------------------------------------------------------- /lecture/java-classic/src/META-INF/services/javax.annotation.processing.Processor: -------------------------------------------------------------------------------- 1 | annotations.Foo 2 | -------------------------------------------------------------------------------- /lecture/java-classic/src/annotations/A.java: -------------------------------------------------------------------------------- 1 | /** Package fuer Code-Snippets in VL "Annotationen" */ 2 | package annotations; 3 | 4 | /** 5 | * Summary fuer Klasse A 6 | * 7 | *

Wozu, warum, wieso :) Wozu, warum, wieso :) Wozu, warum, wieso :) 8 | * 9 | * @author Carsten Gips 10 | */ 11 | public class A { 12 | 13 | /** 14 | * Ein kurzer Satz, der im Abschnitt "Method Summary" stehen wird. 15 | * 16 | *

Es folgt die ausfuehrliche Beschreibung, die spaeter im Abschnitt "Method Detail" 17 | * erscheint, aber nicht in der Uebersicht. 18 | * 19 | * @return Info zu Klasse A 20 | * @see java.util.Calendar 21 | * @deprecated Wurde ersetzt durch {@link #wuppiefluppie()}. 22 | */ 23 | // @Deprecated 24 | public String getInfo() { 25 | return "Klasse A"; 26 | } 27 | 28 | /** Demo fuer Link-Ziel fuer Javadoc ... :) */ 29 | public void wuppiefluppie() {} 30 | } 31 | -------------------------------------------------------------------------------- /lecture/java-classic/src/annotations/WuppieAnnotation.java: -------------------------------------------------------------------------------- 1 | package annotations; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | public class WuppieAnnotation { 6 | public static void main(String[] args) { 7 | WuppieAnnotation w = new WuppieAnnotation(); 8 | w.foo(null); 9 | } 10 | 11 | /** @param o must not be null */ 12 | public void foo(@NotNull Object o) { 13 | int i = o.hashCode(); 14 | } 15 | 16 | /** @param o should not be null */ 17 | public void bar(Object o) { 18 | int i; 19 | if (o != null) { 20 | i = o.hashCode(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lecture/java-classic/src/bounds/Cps.java: -------------------------------------------------------------------------------- 1 | package bounds; 2 | 3 | public class Cps { 4 | // Obere Schranke: E muss Number oder Subklasse sein 5 | // => Zugriff auf Methoden aus Number moeglich 6 | 7 | public static void main(String[] args) { 8 | Cps a; 9 | Cps b; 10 | // Cps c; // Fehler!!! 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/exceptions/better_try_catch/BetterTryCatchMain.java: -------------------------------------------------------------------------------- 1 | package challenges.exceptions.better_try_catch; 2 | 3 | import java.io.File; 4 | 5 | public class BetterTryCatchMain { 6 | public static void main(String[] args) { 7 | String dirPath = "./bettertry/"; 8 | try { 9 | File[] files = MyFunctions.getAllFiles(dirPath); 10 | File randomTxtFile = MyFunctions.getRandomTxtFile(files); 11 | String input = MyFunctions.readFile(randomTxtFile); 12 | int a = MyFunctions.getFirstInteger(input); 13 | randomTxtFile = MyFunctions.getRandomTxtFile(files); 14 | input = MyFunctions.readFile(randomTxtFile); 15 | int b = MyFunctions.getFirstInteger(input); 16 | System.out.print(a + "/" + b + "=" + MyFunctions.div(a, b)); 17 | } catch (Exception e) { 18 | System.out.println("Ups. Da ist was schief gelaufen!"); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/exceptions/better_try_catch/NoNumberFoundException.java: -------------------------------------------------------------------------------- 1 | package challenges.exceptions.better_try_catch; 2 | 3 | public class NoNumberFoundException extends Exception { 4 | public NoNumberFoundException(String msg) { 5 | super(msg); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/exceptions/finally_resources/MyException.java: -------------------------------------------------------------------------------- 1 | package challenges.exceptions.finally_resources; 2 | 3 | public class MyException extends Exception { 4 | public MyException(String msg) { 5 | super(msg); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/exceptions/finally_resources/MyResource.java: -------------------------------------------------------------------------------- 1 | package challenges.exceptions.finally_resources; 2 | 3 | import java.util.Random; 4 | import java.util.logging.Logger; 5 | 6 | public class MyResource { 7 | private Logger log; 8 | private static Random r = new Random(); 9 | 10 | public MyResource() { 11 | log = Logger.getLogger("A"); 12 | log.info(this + " created"); 13 | } 14 | 15 | public void doSomething(int parameter) throws MyException { 16 | open(); 17 | if (parameter < r.nextInt()) throw new MyException("UPS"); 18 | else log.info("Alles gut gegangen!"); 19 | } 20 | 21 | private void open() { 22 | log.info(this + " opened"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/exceptions/where_to_catch/MyException.java: -------------------------------------------------------------------------------- 1 | package challenges.exceptions.where_to_catch; 2 | 3 | public class MyException extends Exception {} 4 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/reflection/calculator/Main.java: -------------------------------------------------------------------------------- 1 | package challenges.reflection.calculator; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new CalculatorUI(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/reflection/calculator/OperationLoader.java: -------------------------------------------------------------------------------- 1 | package challenges.reflection.calculator; 2 | 3 | import operations.IOperation; 4 | 5 | public class OperationLoader { 6 | 7 | /** 8 | * Loads the operation classes from a directory. 9 | * 10 | * @param directory the directory to search for operation classes 11 | * @return a map with the operations and their names, or an empty map if none were found 12 | */ 13 | public static Map loadOperations(File directory) { 14 | //TODO 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/reflection/operations/IOperation.java: -------------------------------------------------------------------------------- 1 | package challenges.reflection.operations; 2 | 3 | public interface IOperation { 4 | int doOperation(int a, int b); 5 | } 6 | 7 | 8 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/regexp/MyMatchResult.java: -------------------------------------------------------------------------------- 1 | package challenges.regexp; 2 | 3 | import java.util.regex.MatchResult; 4 | 5 | public final class MyMatchResult { 6 | public final Token token; 7 | public final MatchResult result; 8 | 9 | public MyMatchResult(Token token, MatchResult result) { 10 | this.token = token; 11 | this.result = result; 12 | } 13 | 14 | public int start() { 15 | return result.start(token.matchingGroup); 16 | } 17 | 18 | public int end() { 19 | return result.end(token.matchingGroup); 20 | } 21 | 22 | public String group() { 23 | return result.group(token.matchingGroup); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/threads/BlueHamster.java: -------------------------------------------------------------------------------- 1 | package threads; 2 | 3 | import java.util.stream.IntStream; 4 | 5 | public record BlueHamster(String name, Tunnel tunnel) implements Hamster { 6 | 7 | public void idle() { 8 | IntStream.range(0, 5).forEach(i -> System.out.println(name() + ": (blue) wandering idly")); 9 | } 10 | 11 | public void moveThroughTunnel() { 12 | System.out.println(name() + ": => (blue) entering tunnel"); 13 | tunnel().enter(this); 14 | System.out.println(name() + ": => (blue) entered tunnel"); 15 | 16 | IntStream.range(0, 2) 17 | .forEach(i -> System.out.println(name() + ": (blue) moving through tunnel")); 18 | 19 | System.out.println(name() + ": (blue) leaving tunnel =>"); 20 | tunnel().leave(this); 21 | System.out.println(name() + ": (blue) left tunnel =>"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/threads/Hamster.java: -------------------------------------------------------------------------------- 1 | package threads; 2 | 3 | public interface Hamster extends Runnable { 4 | String name(); 5 | 6 | Tunnel tunnel(); 7 | 8 | void idle(); 9 | 10 | void moveThroughTunnel(); 11 | 12 | @Override 13 | default void run() { 14 | idle(); 15 | moveThroughTunnel(); 16 | idle(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/threads/Main.java: -------------------------------------------------------------------------------- 1 | package threads; 2 | 3 | public class Main { 4 | public static void main(String... args) { 5 | Tunnel tunnel = Tunnel.get(); 6 | 7 | Hamster bh1 = new BlueHamster("blue1", tunnel); 8 | Hamster bh2 = new BlueHamster("blue2", tunnel); 9 | Hamster bh3 = new BlueHamster("blue3", tunnel); 10 | 11 | Hamster rh1 = new RedHamster("red1", tunnel); 12 | Hamster rh2 = new RedHamster("red2", tunnel); 13 | 14 | new Thread(bh1).start(); 15 | new Thread(bh2).start(); 16 | new Thread(bh3).start(); 17 | new Thread(rh1).start(); 18 | new Thread(rh2).start(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/threads/RedHamster.java: -------------------------------------------------------------------------------- 1 | package threads; 2 | 3 | import java.util.stream.IntStream; 4 | 5 | public record RedHamster(String name, Tunnel tunnel) implements Hamster { 6 | 7 | public void idle() { 8 | IntStream.range(0, 5).forEach(i -> System.out.println(name() + ": (red) wandering idly")); 9 | } 10 | 11 | public void moveThroughTunnel() { 12 | System.out.println(name() + ": => (red) entering tunnel"); 13 | tunnel().enter(this); 14 | System.out.println(name() + ": => (red) entered tunnel"); 15 | 16 | IntStream.range(0, 2) 17 | .forEach(i -> System.out.println(name() + ": (red) moving through tunnel")); 18 | 19 | System.out.println(name() + ": (red) leaving tunnel =>"); 20 | tunnel().leave(this); 21 | System.out.println(name() + ": (red) left tunnel =>"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lecture/java-classic/src/challenges/threads/Tunnel.java: -------------------------------------------------------------------------------- 1 | package threads; 2 | 3 | public class Tunnel { 4 | private static final Tunnel tunnel = new Tunnel(); 5 | 6 | private Tunnel() {} 7 | 8 | public static Tunnel get() { 9 | return tunnel; 10 | } 11 | 12 | public void enter(Hamster hamster) { 13 | System.out.println("\ttunnel: " + hamster.name() + ": in"); 14 | } 15 | 16 | public void leave(Hamster hamster) { 17 | System.out.println("\ttunnel: " + hamster.name() + ": cleared"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lecture/java-classic/src/classes/GenericClasses.java: -------------------------------------------------------------------------------- 1 | package classes; 2 | 3 | class Tutor { 4 | // T kann in Klasse Tutor *fast* wie Klassenname verwendet werden 5 | private T x; 6 | 7 | public T foo(T t) { 8 | System.out.println("Tutor#foo"); 9 | return t; 10 | } 11 | } 12 | 13 | public class GenericClasses { 14 | public static void main(String[] args) { 15 | Tutor a = new Tutor(); 16 | Tutor b = new Tutor<>(); // seit Java 1.7: "Diamond Operator" 17 | 18 | a.foo("wuppie"); 19 | b.foo(1); 20 | // b.foo("huhu"); // Fehlermeldung vom Compiler 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lecture/java-classic/src/cli/Teaser.java: -------------------------------------------------------------------------------- 1 | package cli; 2 | 3 | /** Teaser für die Slides */ 4 | public class Teaser { 5 | /** Hier gibt's nix zu sehen, gehen Sie weiter :) */ 6 | public static void main(String[] args) { 7 | int x = 100; 8 | String answer = ""; 9 | boolean debug = false; 10 | 11 | // Parameter: -x=10 -answer=hello -debug 12 | // => args = ["-x=10", "-answer=hello", "-debug"] 13 | for (String param : args) { 14 | if (param.startsWith("-x")) { x = Integer.parseInt(param.substring(3)); } 15 | if (param.startsWith("-a")) { answer = param.substring(8); } 16 | if (param.startsWith("-d")) { debug = true; } 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lecture/java-classic/src/collections/hash_example/Point.java: -------------------------------------------------------------------------------- 1 | package hash_example; 2 | 3 | public record Point(int x, int y, String name) { 4 | @Override 5 | public boolean equals(Object o) { 6 | if (o == null) return false; 7 | if (o == this) return true; 8 | if (!(o instanceof Point)) return false; 9 | 10 | Point other = (Point) o; 11 | return x == other.x && y == other.y; 12 | } 13 | 14 | @Override 15 | public int hashCode() { 16 | return x + y; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lecture/java-classic/src/collections/iterator_example/IteratorExample.java: -------------------------------------------------------------------------------- 1 | package iterator_example; 2 | 3 | import java.util.Iterator; 4 | 5 | public class IteratorExample { 6 | public static void main(String[] args) { 7 | BinarySearchTree tree = new BinarySearchTree<>(); 8 | tree.add(4); 9 | tree.add(12); 10 | tree.add(5); 11 | tree.add(3); 12 | tree.add(9); 13 | tree.add(33); 14 | tree.add(-5); 15 | tree.add(2); 16 | // hol den iterator 17 | Iterator iterator = tree.iterator(); 18 | System.out.println(iterator.next().getData()); 19 | iterator.forEachRemaining(n -> System.out.println(n.getData())); 20 | System.out.println(iterator.hasNext()); 21 | // iterator.next(); //NoSuchElement Exception 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lecture/java-classic/src/enums/FinalDemo.java: -------------------------------------------------------------------------------- 1 | package enums; 2 | 3 | public class FinalDemo { 4 | public static void main(String[] args) { 5 | int i = 2; 6 | final int j = 3; 7 | final int k; 8 | i = 3; 9 | // j = 4; // Compilerfehler! 10 | k = 5; 11 | // k = 6; // Compilerfehler! 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lecture/java-classic/src/enums/v1/Studi.java: -------------------------------------------------------------------------------- 1 | package enums.v1; 2 | 3 | public class Studi { 4 | public static final int IFM = 0; 5 | public static final int ELM = 1; 6 | public static final int ARC = 2; 7 | 8 | public Studi(String name, int credits, int studiengang) { 9 | // Wert für studiengang muss zwischen 0 und 2 liegen 10 | // Erwünscht: Konstanten nutzen 11 | } 12 | 13 | public static void main(String[] args) { 14 | Studi rainer = new Studi("Rainer", 10, Studi.IFM); 15 | Studi holger = new Studi("Holger", 3, 4); // Laufzeit-Problem! 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lecture/java-classic/src/enums/v3/Studi.java: -------------------------------------------------------------------------------- 1 | package enums.v3; 2 | 3 | public class Studi { 4 | public Studi(String name, int credits, Fach studiengang) {} 5 | 6 | public static void main(String[] args) { 7 | Studi rainer = new Studi("Rainer", 10, Fach.IFM); 8 | Fach x = Fach.IFM; 9 | 10 | System.out.println("\n"); 11 | System.out.println("Direkte Ausgabe: " + x); 12 | System.out.println("name(): " + x.name()); 13 | System.out.println("ordinal(): " + x.ordinal()); 14 | 15 | System.out.println("toString(): " + x); 16 | System.out.println("getBeschreibung(): " + x.getDescription()); 17 | 18 | System.out.println("\n"); 19 | // valueOf(String): zum String passende Konstante 20 | System.out.println("valueOf(): " + (Fach.valueOf("IFM") == Fach.IFM)); 21 | 22 | System.out.println("\n"); 23 | for (Fach m : Fach.values()) { 24 | // values(): Alle Konstanten der Aufzählung 25 | System.out.printf("Element: %s, Beschreibung: %s%n", m, m.getDescription()); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lecture/java-classic/src/exceptions/MyCheckedException.java: -------------------------------------------------------------------------------- 1 | package exceptions; 2 | 3 | /** Checked-Exceptions leiten von Exception ab */ 4 | public class MyCheckedException extends Exception { 5 | /** Erzeuge neue checked Exception */ 6 | public MyCheckedException(String errorMessage) { 7 | super(errorMessage); 8 | } 9 | 10 | private static void myMethod(int x) throws MyCheckedException { 11 | if (x > 5 || x < 10) { 12 | throw new MyCheckedException("Ich finde x doof."); 13 | } 14 | } 15 | 16 | /** Just to please Checkstyle */ 17 | public static void main(String... args) { 18 | // Checked-Exceptions müssen gefangen werden. 19 | try { 20 | myMethod(12); 21 | } catch (MyCheckedException e) { 22 | throw new RuntimeException(e); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lecture/java-classic/src/exceptions/MyUncheckedException.java: -------------------------------------------------------------------------------- 1 | package exceptions; 2 | 3 | /** Unchecked-Exceptions leiten von RuntimeException ab */ 4 | public class MyUncheckedException extends RuntimeException { 5 | /** Erzeuge neue unchecked Exception */ 6 | public MyUncheckedException(String errorMessage) { 7 | super(errorMessage); 8 | } 9 | 10 | private static void myMethod(int x) throws MyUncheckedException { 11 | if (x > 5 || x < 10) { 12 | throw new MyUncheckedException("Ich finde x doof."); 13 | } 14 | } 15 | 16 | /** Just to please Checkstyle */ 17 | public static void main(String... args) { 18 | // Unchecked-Exceptions müssen nicht gefangen werden. 19 | myMethod(12); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lecture/java-classic/src/exceptions/WhereToCatch.java: -------------------------------------------------------------------------------- 1 | package exceptions; 2 | 3 | import java.io.BufferedWriter; 4 | import java.io.FileWriter; 5 | import java.io.IOException; 6 | import javax.swing.JFileChooser; 7 | 8 | /** Beispiel: Wo fange ich eine Exception */ 9 | public class WhereToCatch { 10 | private static void methode1(int x) throws IOException { 11 | JFileChooser fc = new JFileChooser(); 12 | fc.showDialog(null, "ok"); 13 | methode2(fc.getSelectedFile().toString(), x, x * 2); 14 | } 15 | 16 | private static void methode2(String path, int x, int y) throws IOException { 17 | FileWriter fw = new FileWriter(path); 18 | BufferedWriter bw = new BufferedWriter(fw); 19 | bw.write("X:" + x + " Y: " + y); 20 | bw.flush(); 21 | } 22 | 23 | /** Just to please Checkstyle */ 24 | public static void main(String... args) { 25 | try { 26 | methode1(42); 27 | } catch (IOException ioe) { 28 | ioe.printStackTrace(); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lecture/java-classic/src/intro/Traditional.java: -------------------------------------------------------------------------------- 1 | package intro; 2 | 3 | import java.util.stream.IntStream; 4 | 5 | /** Traditionelles Programm: Sequentielle Verarbeitung */ 6 | public class Traditional { 7 | private int val = 0; 8 | 9 | /** Starte die Demo */ 10 | public static void main(String... args) { 11 | Traditional x = new Traditional(); 12 | 13 | System.out.println("main(): vor run()"); 14 | x.run(); 15 | System.out.println("main(): nach run()"); 16 | } 17 | 18 | private int incrVal() { 19 | return val++; 20 | } 21 | 22 | /** 23 | * Lasst uns eine Schleife ausführen 24 | * 25 | *

Diese Schleife wird sequentiell ausgeführt: Erst die Ausgabe in main(), dann geht der 26 | * Kontrollfluss hier in die Methode und die Schleife wird ausgeführt, und danach geht der 27 | * Kontrollfluss wieder zurück nach main() und die letzte Ausgabe dort wird gemacht. 28 | */ 29 | public void run() { 30 | IntStream.range(0, 10).mapToObj(i -> "in run(): " + incrVal()).forEach(System.out::println); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lecture/java-classic/src/reflection/Wuppie.java: -------------------------------------------------------------------------------- 1 | package reflection; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * Dummy-Annotation. 10 | * 11 | *

Kann an Methoden angewendet werden, bleibt zur Laufzeit auswertbar. 12 | */ 13 | @Target(value = ElementType.METHOD) 14 | @Retention(value = RetentionPolicy.RUNTIME) 15 | public @interface Wuppie { 16 | String value() default "wuppie"; 17 | } 18 | -------------------------------------------------------------------------------- /lecture/java-classic/src/regexp/Backref.java: -------------------------------------------------------------------------------- 1 | package regexp; 2 | 3 | /** Demo für Backreferences */ 4 | public class Backref { 5 | /** Starter - use the debugger */ 6 | public static void main(String[] args) { 7 | boolean e; 8 | 9 | e = "1212".matches("(\\d\\d)\\1"); 10 | e = "1223".matches("(\\d\\d)\\1"); 11 | e = "1212".matches("(?\\d\\d)\\k"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lecture/java-classic/src/regexp/Groups.java: -------------------------------------------------------------------------------- 1 | package regexp; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | /** Demo für Gruppen */ 7 | public class Groups { 8 | /** Starter - use the debugger */ 9 | public static void main(String[] args) { 10 | Pattern p = Pattern.compile(".*((\\d+)\\s*A).*"); 11 | Matcher m = p.matcher("A 12 A 45 A"); 12 | 13 | if (m.matches()) { 14 | for (int i = 0; i <= m.groupCount(); i++) { 15 | m.group(i); // i. Gruppe 16 | } 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lecture/java-classic/src/regexp/MatchFind.java: -------------------------------------------------------------------------------- 1 | package regexp; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | /** Demo für Pattern und Matcher */ 7 | public class MatchFind { 8 | /** Starter - use the debugger */ 9 | public static void main(String[] args) { 10 | boolean e; 11 | 12 | Pattern p = Pattern.compile("Hello"); 13 | 14 | Matcher m = p.matcher("Hello World"); 15 | e = m.find(); 16 | e = m.matches(); 17 | 18 | m = p.matcher("Hello"); 19 | e = m.find(); 20 | e = m.matches(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lecture/java-classic/src/regexp/Quantifier.java: -------------------------------------------------------------------------------- 1 | package regexp; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | /** Demo für Quantifier */ 7 | public class Quantifier { 8 | /** Starter - use the debugger */ 9 | public static void main(String[] args) { 10 | Pattern p = Pattern.compile("A.*A"); 11 | // Pattern p = Pattern.compile("A.*?A"); 12 | Matcher m = p.matcher("A 12 A 45 A"); 13 | 14 | if (m.matches()) { 15 | // if (m.find()) { 16 | m.group(); // Text 17 | m.start(); // Startposition 18 | m.end(); // Endposition 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lecture/java-classic/src/regexp/StringSplit.java: -------------------------------------------------------------------------------- 1 | package regexp; 2 | 3 | /** Demo für String.split() */ 4 | public class StringSplit { 5 | /** Starter - use the debugger */ 6 | public static void main(String[] args) { 7 | String a = "boo:and:foo"; 8 | String[] e; 9 | boolean b; 10 | 11 | e = a.split(":"); 12 | e = a.split("o"); 13 | e = a.split("b"); 14 | 15 | b = a.matches(" "); 16 | b = a.matches("boo:and:foo"); 17 | b = a.matches("boo"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lecture/java-classic/src/synchronised/Deadlock.java: -------------------------------------------------------------------------------- 1 | package synchronised; 2 | 3 | /** Konkurrierender Zugriff auf gemeinsame Ressource: Synchronisierung über Methode */ 4 | public class Deadlock { 5 | private final String name; 6 | 7 | /** Initialisiere neues Objekt */ 8 | public Deadlock(String name) { 9 | this.name = name; 10 | } 11 | 12 | /** Starte die Demo */ 13 | public static void main(String... args) { 14 | final Deadlock a = new Deadlock("a"); 15 | final Deadlock b = new Deadlock("b"); 16 | 17 | new Thread(() -> a.foo(b)).start(); 18 | new Thread(() -> b.foo(a)).start(); 19 | } 20 | 21 | /** Einstieg: Wird von beiden Threads aufgerufen */ 22 | public synchronized void foo(Deadlock other) { 23 | System.out.format("%s: %s.foo() \n", Thread.currentThread().getName(), name); 24 | System.out.format("%s: %s.name()\n", Thread.currentThread().getName(), other.getName()); 25 | } 26 | 27 | /** Wird von foo() aufgerufen, führt zum Deadlock */ 28 | public synchronized String getName() { 29 | return name; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lecture/java-classic/src/synchronised/MethodSync.java: -------------------------------------------------------------------------------- 1 | package synchronised; 2 | 3 | import java.util.stream.IntStream; 4 | 5 | /** Konkurrierender Zugriff auf gemeinsame Ressource: Synchronisierung über Methode */ 6 | public class MethodSync implements Runnable { 7 | private int val = 0; 8 | 9 | /** Starte die Demo */ 10 | public static void main(String... args) { 11 | MethodSync x = new MethodSync(); 12 | 13 | // Zwei Threads auf dem *selben* Runnable => konkurrierender Zugriff auf val 14 | new Thread(x).start(); 15 | new Thread(x).start(); 16 | } 17 | 18 | private synchronized void incrVal() { 19 | ++val; // Zugriff auf gemeinsame Ressource 20 | System.out.println(Thread.currentThread().getId() + ": " + val); 21 | } 22 | 23 | @Override 24 | public void run() { 25 | IntStream.range(0, 5).forEach(i -> incrVal()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lecture/java-classic/src/synchronised/ObjSync.java: -------------------------------------------------------------------------------- 1 | package synchronised; 2 | 3 | import java.util.stream.IntStream; 4 | 5 | /** Konkurrierender Zugriff auf gemeinsame Ressource: Synchronisierung über Objekt */ 6 | public class ObjSync implements Runnable { 7 | private final Object waechter = new Object(); // gemeinsames Sperr-Objekt 8 | private int val = 0; 9 | 10 | /** Starte die Demo */ 11 | public static void main(String... args) { 12 | ObjSync x = new ObjSync(); 13 | 14 | // Zwei Threads auf dem *selben* Runnable => konkurrierender Zugriff auf val 15 | new Thread(x).start(); 16 | new Thread(x).start(); 17 | } 18 | 19 | private void incrVal() { 20 | synchronized (waechter) { 21 | ++val; // Zugriff auf gemeinsame Ressource 22 | System.out.println(Thread.currentThread().getId() + ": " + val); 23 | } 24 | } 25 | 26 | @Override 27 | public void run() { 28 | IntStream.range(0, 5).forEach(i -> incrVal()); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lecture/java-classic/src/synchronised/Teaser.java: -------------------------------------------------------------------------------- 1 | package synchronised; 2 | 3 | import java.util.stream.IntStream; 4 | 5 | /** Konkurrierender Zugriff auf gemeinsame Ressource (KAPUTTE Variante) */ 6 | public class Teaser implements Runnable { 7 | private int val = 0; 8 | 9 | /** Starte die Demo */ 10 | public static void main(String... args) { 11 | Teaser x = new Teaser(); 12 | 13 | // Zwei Threads auf dem *selben* Runnable => konkurrierender Zugriff auf val 14 | new Thread(x).start(); 15 | new Thread(x).start(); 16 | } 17 | 18 | private void incrVal() { 19 | ++val; // Zugriff auf gemeinsame Ressource 20 | System.out.println(Thread.currentThread().getId() + ": " + val); 21 | } 22 | 23 | @Override 24 | public void run() { 25 | IntStream.range(0, 5).forEach(i -> incrVal()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lecture/java-classic/src/wildcards/v1/X.java: -------------------------------------------------------------------------------- 1 | package wildcards.v1; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | class A { 7 | void printInfo() { 8 | System.out.println("A"); 9 | } 10 | } 11 | 12 | class B extends A { 13 | @Override 14 | void printInfo() { 15 | System.out.println("B"); 16 | } 17 | } 18 | 19 | public class X { 20 | public static void printInfo(List list) { 21 | for (A a : list) { 22 | a.printInfo(); 23 | } 24 | } 25 | 26 | public static void main(String[] args) { 27 | List x = new ArrayList(); 28 | x.add(new A()); 29 | x.add(new B()); 30 | printInfo(x); 31 | 32 | List y = new ArrayList(); 33 | y.add(new B()); 34 | y.add(new B()); 35 | // printInfo(y); // Compiler-Fehler 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lecture/java-classic/src/wildcards/v2/X.java: -------------------------------------------------------------------------------- 1 | package wildcards.v2; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | class A { 7 | void printInfo() { 8 | System.out.println("A"); 9 | } 10 | } 11 | 12 | class B extends A { 13 | @Override 14 | void printInfo() { 15 | System.out.println("B"); 16 | } 17 | } 18 | 19 | public class X { 20 | public static void printInfo(List list) { 21 | for (Object a : list) { 22 | // a.printInfo(); // Compiler-Fehler 23 | } 24 | } 25 | 26 | public static void main(String[] args) { 27 | List x = new ArrayList(); 28 | x.add(new A()); 29 | x.add(new B()); 30 | printInfo(x); 31 | 32 | List y = new ArrayList(); 33 | y.add(new B()); 34 | y.add(new B()); 35 | printInfo(y); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lecture/java-classic/src/wildcards/v3/X.java: -------------------------------------------------------------------------------- 1 | package wildcards.v3; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | class A { 7 | void printInfo() { 8 | System.out.println("A"); 9 | } 10 | } 11 | 12 | class B extends A { 13 | @Override 14 | void printInfo() { 15 | System.out.println("B"); 16 | } 17 | } 18 | 19 | public class X { 20 | public static void printInfo(List list) { 21 | for (A a : list) { 22 | a.printInfo(); 23 | } 24 | } 25 | 26 | public static void main(String[] args) { 27 | List x = new ArrayList(); 28 | x.add(new A()); 29 | x.add(new B()); 30 | printInfo(x); 31 | 32 | List y = new ArrayList(); 33 | y.add(new B()); 34 | y.add(new B()); 35 | printInfo(y); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lecture/java-modern/images/screenshot_katze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-modern/images/screenshot_katze.png -------------------------------------------------------------------------------- /lecture/java-modern/images/screenshot_review1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-modern/images/screenshot_review1.png -------------------------------------------------------------------------------- /lecture/java-modern/images/screenshot_review2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-modern/images/screenshot_review2.png -------------------------------------------------------------------------------- /lecture/java-modern/images/screenshot_review3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/java-modern/images/screenshot_review3.png -------------------------------------------------------------------------------- /lecture/java-modern/readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Modern Java: Funktionaler Stil und Stream-API" 3 | no_pdf: true 4 | no_beamer: true 5 | --- 6 | -------------------------------------------------------------------------------- /lecture/java-modern/src/challenges/defaults/Enten.java: -------------------------------------------------------------------------------- 1 | package challenges.defaults; 2 | 3 | public class Enten { 4 | 5 | public interface Flugvogel { 6 | default void fortbewegen() { 7 | System.out.println("Fliegt durch die Luft."); 8 | } 9 | } 10 | 11 | public interface Wasservogel { 12 | default void fortbewegen() { 13 | System.out.println("Schwimmt im Wasser."); 14 | } 15 | } 16 | 17 | public static class Ente implements Flugvogel, Wasservogel { 18 | @Override 19 | public void fortbewegen() { 20 | Flugvogel.super.fortbewegen(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lecture/java-modern/src/challenges/defaults/Kolibris.java: -------------------------------------------------------------------------------- 1 | package challenges.defaults; 2 | 3 | public class Kolibris { 4 | 5 | public interface Vogel { 6 | default void schweben() { 7 | System.out.println("Sehr starkes hin und her."); 8 | } 9 | } 10 | 11 | public interface Tropenvogel extends Vogel { 12 | default void schweben() { 13 | System.out.println("Immer noch sehr starkes hin und her."); 14 | } 15 | } 16 | 17 | public static class Kolibri implements Vogel { 18 | @Override 19 | public void schweben() { 20 | System.out.println("Fast perfekt auf der Stelle."); 21 | } 22 | } 23 | 24 | public static class Adlerschnabel extends Kolibri implements Vogel, Tropenvogel {} 25 | } 26 | -------------------------------------------------------------------------------- /lecture/java-modern/src/challenges/defaults/Main.java: -------------------------------------------------------------------------------- 1 | package challenges.defaults; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new Voegel.Schornsteinsegler().gleiten(); 6 | new Enten.Ente().fortbewegen(); 7 | new Pinguine.Kaiserpinguin().schwimmen(); 8 | new Kolibris.Adlerschnabel().schweben(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lecture/java-modern/src/challenges/defaults/Pinguine.java: -------------------------------------------------------------------------------- 1 | package challenges.defaults; 2 | 3 | public class Pinguine { 4 | 5 | public interface Vogel { 6 | default void schwimmen() { 7 | System.out.println("Ich fliege. Schwimmen ist für Pinguine!"); 8 | } 9 | } 10 | 11 | public interface Seevogel extends Vogel { 12 | default void schwimmen() { 13 | System.out.println("Ich paddle vor mich hin."); 14 | } 15 | } 16 | 17 | public interface Grosspinguine extends Vogel, Seevogel { 18 | default void schwimmen() { 19 | System.out.println("Ich tauche gern."); 20 | } 21 | } 22 | 23 | public static class Pinguin implements Vogel {} 24 | 25 | public static class Kaiserpinguin extends Pinguin implements Vogel, Seevogel, Grosspinguine {} 26 | } 27 | -------------------------------------------------------------------------------- /lecture/java-modern/src/challenges/defaults/Voegel.java: -------------------------------------------------------------------------------- 1 | package challenges.defaults; 2 | 3 | public class Voegel { 4 | 5 | public interface Vogel { 6 | default void gleiten() { 7 | System.out.println("Mittlere Distanz gegleitet."); 8 | } 9 | } 10 | 11 | public interface Segler extends Vogel { 12 | default void gleiten() { 13 | System.out.println("Lange Distanz gegleitet"); 14 | } 15 | } 16 | 17 | public static class Schornsteinsegler implements Vogel, Segler {} 18 | } 19 | -------------------------------------------------------------------------------- /lecture/java-modern/src/challenges/lambda/Student.java: -------------------------------------------------------------------------------- 1 | package challenges.lambda; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | import java.util.Date; 6 | 7 | public class Student { 8 | private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd.MM.yyyy"); 9 | 10 | private String name; 11 | private Date birthday; 12 | 13 | public Student(String name, String birthday) throws ParseException { 14 | this.name = name; 15 | this.birthday = DATE_FORMAT.parse(birthday); 16 | } 17 | 18 | public String getName() { 19 | return name; 20 | } 21 | 22 | public Date getBirthday() { 23 | return birthday; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lecture/java-modern/src/challenges/optional/Box.java: -------------------------------------------------------------------------------- 1 | package challenges.optional; 2 | 3 | /** 4 | * @param xSize Breite des Kartons 5 | * @param ySize Länge des Kartons 6 | * @param zSize Höhe des Kartons 7 | * @param material Material des Karton 8 | */ 9 | public record Box(float xSize, float ySize, float zSize, Material material) { 10 | } 11 | -------------------------------------------------------------------------------- /lecture/java-modern/src/challenges/optional/Katze.java: -------------------------------------------------------------------------------- 1 | package challenges.optional; 2 | 3 | /** 4 | * @param name Name der Katze 5 | * @param gewicht Gewicht der Katze in kg 6 | * @param lieblingsBox Lieblingsbox der Katze 7 | */ 8 | public record Katze(String name, float gewicht, Box lieblingsBox) { 9 | } 10 | -------------------------------------------------------------------------------- /lecture/java-modern/src/challenges/optional/Material.java: -------------------------------------------------------------------------------- 1 | package challenges.optional; 2 | 3 | /** Material aus dem Boxen sein können */ 4 | public enum Material { 5 | KARTON, 6 | HOLZ, 7 | KISSEN, 8 | TAPE 9 | } 10 | -------------------------------------------------------------------------------- /lecture/java-modern/src/challenges/streams/Student.java: -------------------------------------------------------------------------------- 1 | package challenges.streams; 2 | 3 | public class Student { 4 | private String name; 5 | private int cps; 6 | 7 | public Student(String name, int cps) { 8 | this.name = name; 9 | this.cps = cps; 10 | } 11 | 12 | public String getName() { 13 | return name; 14 | } 15 | 16 | public int getCps() { 17 | return cps; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lecture/java-modern/src/challenges/streams/file.txt: -------------------------------------------------------------------------------- 1 | a 2 | b 3 | c 4 | aa 5 | ab 6 | ac 7 | ba 8 | -------------------------------------------------------------------------------- /lecture/java-modern/src/defaultmethods/quiz/DefaultTest.java: -------------------------------------------------------------------------------- 1 | package defaultmethods.quiz; 2 | 3 | interface A { 4 | default String hello() { 5 | return "A"; 6 | } 7 | } 8 | 9 | interface B extends A { 10 | @Override 11 | default String hello() { 12 | return "B"; 13 | } 14 | } 15 | 16 | class C implements B { 17 | @Override 18 | public String hello() { 19 | return "C"; 20 | } 21 | } 22 | 23 | class D extends C implements A, B {} 24 | 25 | /** Quiz Mehrfachvererbung */ 26 | public class DefaultTest { 27 | /** Starter - just to please Checkstyle ;-) */ 28 | public static void main(String... args) { 29 | String e = new D().hello(); // ??? 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lecture/java-modern/src/defaultmethods/rule1/DefaultTest1.java: -------------------------------------------------------------------------------- 1 | package defaultmethods.rule1; 2 | 3 | interface A { 4 | default String hello() { 5 | return "A"; 6 | } 7 | } 8 | 9 | interface B { 10 | default String hello() { 11 | return "B"; 12 | } 13 | } 14 | 15 | class C implements A { 16 | @Override 17 | public String hello() { 18 | return "C"; 19 | } 20 | } 21 | 22 | class D { 23 | public String hello() { 24 | return "D"; 25 | } 26 | } 27 | 28 | class E extends C implements A, B {} 29 | 30 | /** Auflösung Mehrfachvererbung: 1. Klassen gewinnen */ 31 | public class DefaultTest1 { 32 | /** Starter - just to please Checkstyle ;-) */ 33 | public static void main(String... args) { 34 | String e = new E().hello(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lecture/java-modern/src/defaultmethods/rule2/DefaultTest2.java: -------------------------------------------------------------------------------- 1 | package defaultmethods.rule2; 2 | 3 | interface A { 4 | default String hello() { 5 | return "A"; 6 | } 7 | } 8 | 9 | interface B extends A { 10 | @Override 11 | default String hello() { 12 | return "B"; 13 | } 14 | } 15 | 16 | interface C extends B { 17 | @Override 18 | default String hello() { 19 | return "C"; 20 | } 21 | } 22 | 23 | class D implements A, B {} 24 | 25 | /** Auflösung Mehrfachvererbung: 2. Sub-Interfaces gewinnen */ 26 | public class DefaultTest2 { 27 | /** Starter - just to please Checkstyle ;-) */ 28 | public static void main(String... args) { 29 | String e = new D().hello(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lecture/java-modern/src/defaultmethods/rule3/DefaultTest3.java: -------------------------------------------------------------------------------- 1 | package defaultmethods.rule3; 2 | 3 | interface A { 4 | default String hello() { 5 | return "A"; 6 | } 7 | } 8 | 9 | interface B { 10 | default String hello() { 11 | return "B"; 12 | } 13 | } 14 | 15 | interface C extends B { 16 | @Override 17 | default String hello() { 18 | return "C"; 19 | } 20 | } 21 | 22 | class D implements A, B { 23 | @Override 24 | public String hello() { 25 | return A.super.hello(); 26 | } 27 | } 28 | 29 | /** Auflösung Mehrfachvererbung: 3. Methode explizit auswählen */ 30 | public class DefaultTest3 { 31 | /** Starter - just to please Checkstyle ;-) */ 32 | public static void main(String... args) { 33 | String e = new D().hello(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lecture/java-modern/src/methodreferences/DemoInstanceMethodReferenceObject.java: -------------------------------------------------------------------------------- 1 | package methodreferences; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | 7 | /** Beispiel: Referenz auf Instanz-Methode (Objekt) */ 8 | public class DemoInstanceMethodReferenceObject { 9 | /** Just to please Checkstyle */ 10 | public static void main(String... args) { 11 | List sl = new ArrayList(); 12 | Studi holger = new Studi("Holger", 42); 13 | 14 | // Referenz auf Instanz-Methode eines Objekts 15 | Collections.sort(sl, holger::cmpCpsInstance); 16 | 17 | // Entsprechender Lambda-Ausdruck 18 | Collections.sort(sl, (o1, o2) -> holger.cmpCpsInstance(o1, o2)); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lecture/java-modern/src/methodreferences/DemoInstanceMethodReferenceType.java: -------------------------------------------------------------------------------- 1 | package methodreferences; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | 7 | /** Beispiel: Referenz auf Instanz-Methode (Typ) */ 8 | public class DemoInstanceMethodReferenceType { 9 | /** Just to please Checkstyle */ 10 | public static void main(String... args) { 11 | List sl = new ArrayList(); 12 | 13 | // Referenz auf Instanz-Methode eines Typs 14 | Collections.sort(sl, Studi::cmpCpsInstance); 15 | 16 | // Entsprechender Lambda-Ausdruck 17 | Collections.sort(sl, (o1, o2) -> o1.cmpCpsInstance(o2)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lecture/java-modern/src/methodreferences/DemoStaticMethodReference.java: -------------------------------------------------------------------------------- 1 | package methodreferences; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | 7 | /** Beispiel: Referenz auf statische Methode */ 8 | public class DemoStaticMethodReference { 9 | /** Just to please Checkstyle */ 10 | public static void main(String... args) { 11 | List sl = new ArrayList(); 12 | 13 | // Referenz auf statische Methode 14 | Collections.sort(sl, Studi::cmpCpsClass); 15 | 16 | // Entsprechender Lambda-Ausdruck 17 | Collections.sort(sl, (o1, o2) -> Studi.cmpCpsClass(o1, o2)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lecture/java-modern/src/methodreferences/Teaser.java: -------------------------------------------------------------------------------- 1 | package methodreferences; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.Comparator; 6 | import java.util.List; 7 | 8 | /** Code für die Motivation in der Vorlesung */ 9 | public class Teaser { 10 | /** Just to please Checkstyle */ 11 | public static void main(String... args) { 12 | List sl = new ArrayList(); 13 | 14 | // Anonyme innere Klasse 15 | Collections.sort( 16 | sl, 17 | new Comparator() { 18 | @Override 19 | public int compare(Studi o1, Studi o2) { 20 | return Studi.cmpCpsClass(o1, o2); 21 | } 22 | }); 23 | 24 | // Lambda-Ausdruck 25 | Collections.sort(sl, (o1, o2) -> Studi.cmpCpsClass(o1, o2)); 26 | 27 | // Methoden-Referenz 28 | Collections.sort(sl, Studi::cmpCpsClass); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lecture/java-modern/src/methodreferences/ThreadStarter.java: -------------------------------------------------------------------------------- 1 | package methodreferences; 2 | 3 | /** 4 | * Beispiel: Starten von Threads 5 | */ 6 | public class ThreadStarter { 7 | /** 8 | * Methode für Aufruf per Methoden-Referenz 9 | */ 10 | public static void wuppie() { 11 | System.out.println("wuppie(): wuppie"); 12 | } 13 | 14 | /** 15 | * Starter - just to please Checkstyle 16 | */ 17 | public static void main(String[] args) { 18 | // Anonyme innere Klasse 19 | Thread t1 = new Thread(new Runnable() { 20 | public void run() { 21 | System.out.println("t1: wuppie"); 22 | } 23 | }); 24 | 25 | // Lambda-Ausdruck 26 | Thread t2 = new Thread(() -> System.out.println("t2: wuppie")); 27 | 28 | // Methodenreferenz 29 | Thread t3 = new Thread(ThreadStarter::wuppie); 30 | 31 | // Und nun los: Startet ... 32 | t1.start(); 33 | t2.start(); 34 | t3.start(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lecture/java-modern/src/nested/DemoAnonymousInnerClass.java: -------------------------------------------------------------------------------- 1 | package nested; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Comparator; 5 | import java.util.List; 6 | 7 | /** Sortieren einer Liste mit einer anonymen inneren Klasse */ 8 | public class DemoAnonymousInnerClass { 9 | /** Just to please Checkstyle */ 10 | public static void main(String... args) { 11 | List sl = new ArrayList<>(); 12 | 13 | // Parametrisierung mit anonymer Klasse 14 | sl.sort( 15 | new Comparator() { 16 | @Override 17 | public int compare(Studi o1, Studi o2) { 18 | return o1.getCredits() - o2.getCredits(); 19 | } 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lecture/java-modern/src/nested/DemoComparator.java: -------------------------------------------------------------------------------- 1 | package nested; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Comparator; 5 | import java.util.List; 6 | 7 | class MyCompare implements Comparator { 8 | @Override 9 | public int compare(Studi o1, Studi o2) { 10 | return o1.getCredits() - o2.getCredits(); 11 | } 12 | } 13 | 14 | /** Nur als Vorlage für die Folien ... */ 15 | public class DemoComparator { 16 | /** Just to please Checkstyle */ 17 | public static void main(String... args) { 18 | List sl = new ArrayList<>(); 19 | 20 | // Liste sortieren? 21 | MyCompare mc = new MyCompare(); 22 | sl.sort(mc); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lecture/java-modern/src/nested/DemoLambda.java: -------------------------------------------------------------------------------- 1 | package nested; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** Sortieren einer Liste mit einem Lambda-Ausdruck */ 7 | public class DemoLambda { 8 | /** Just to please Checkstyle */ 9 | public static void main(String... args) { 10 | List sl = new ArrayList<>(); 11 | 12 | // Parametrisierung mit Lambda-Ausdruck 13 | sl.sort((Studi o1, Studi o2) -> o1.getCredits() - o2.getCredits()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lecture/java-modern/src/nested/Outer.java: -------------------------------------------------------------------------------- 1 | package nested; 2 | 3 | /** Nur als Vorlage für die Folien ... */ 4 | public class Outer { 5 | /** Just to please Checkstyle :) */ 6 | public static void main(String[] args) { 7 | Outer.Inner inner = new Outer().new Inner(); 8 | Outer.StaticNested nested = new Outer.StaticNested(); 9 | } 10 | 11 | static class StaticNested {} 12 | 13 | private class Inner {} 14 | } 15 | -------------------------------------------------------------------------------- /lecture/java-modern/src/nested/Studi.java: -------------------------------------------------------------------------------- 1 | package nested; 2 | 3 | /** Hilfsklasse: Modellieren wir einen Studi */ 4 | public class Studi { 5 | private final String name; 6 | private final int credits; 7 | 8 | /** 9 | * Konstruktor: Baue einen neuen Studi 10 | * 11 | * @param name Name des neuen Studis 12 | * @param credits Credits des neuen Studis 13 | */ 14 | public Studi(String name, int credits) { 15 | this.name = name; 16 | this.credits = credits; 17 | } 18 | 19 | /** Wie heisse ich? */ 20 | public String getName() { 21 | return name; 22 | } 23 | 24 | /** Wieviele Credits habe ich? */ 25 | public int getCredits() { 26 | return credits; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lecture/java-modern/src/nested/Wuppie.java: -------------------------------------------------------------------------------- 1 | package nested; 2 | 3 | /** Beispiel für ein einfaches funktionales Interface */ 4 | @FunctionalInterface 5 | public interface Wuppie { 6 | /** Abstrakte Methode - _muss_ implementiert werden */ 7 | int wuppie(T obj); 8 | 9 | /** Abstrakte Methode, von java.lang.Object geerbt */ 10 | boolean equals(Object obj); 11 | 12 | /** Default-Methode */ 13 | default void fluppie() { 14 | throw new UnsupportedOperationException(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lecture/java-modern/src/optional/streams/Demo.java: -------------------------------------------------------------------------------- 1 | package optional.streams; 2 | 3 | import java.util.NoSuchElementException; 4 | 5 | /** Demo: Optional mit Streams */ 6 | public class Demo { 7 | /** Just to please Checkstyle */ 8 | public static void main(String... args) { 9 | LSF lsf = new LSF(); 10 | 11 | Studi holger = new Studi("Holger", 7); 12 | Studi anne = new Studi("Anne", 42); 13 | 14 | lsf.anmelden(holger); 15 | lsf.anmelden(anne); 16 | 17 | try { 18 | // Hole Studi und löse den Namen auf oder NoSuchElementException 19 | String name = lsf.getBestStudi().map(Studi::name).orElseThrow(); 20 | // mach was mit dem Namen ... 21 | } catch (NoSuchElementException nsee) { 22 | // Oops: Entweder der Rückgabewert von getBestStudi() war leer, 23 | // oder Studi::name hat null geliefert. 24 | } catch (NullPointerException npe) { 25 | // Oops: Es gab noch keine Sammlung ... 26 | } catch (Exception e) { 27 | // Oops: Etwas anderes Unerwartetes ist passiert ... 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lecture/java-modern/src/optional/streams/LSF.java: -------------------------------------------------------------------------------- 1 | package optional.streams; 2 | 3 | import java.util.HashSet; 4 | import java.util.Optional; 5 | import java.util.Set; 6 | 7 | /** Modellierung des LSF */ 8 | public class LSF { 9 | private final Set sl = new HashSet<>(); 10 | 11 | /** Anmelden eines Studis */ 12 | public boolean anmelden(Studi s) { 13 | return sl.add(s); 14 | } 15 | 16 | /** Abmelden eines Studis */ 17 | public boolean abmelden(Studi s) { 18 | return sl.remove(s); 19 | } 20 | 21 | /** Finde den Studi mit den meisten Credits */ 22 | public Optional getBestStudi() throws NullPointerException { 23 | // Fehler: Es gibt noch keine Sammlung 24 | if (sl == null) throw new NullPointerException("There ain't any collection"); 25 | 26 | return sl.stream().sorted((s1, s2) -> s2.credits() - s1.credits()).findFirst(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lecture/java-modern/src/optional/streams/Studi.java: -------------------------------------------------------------------------------- 1 | package optional.streams; 2 | 3 | /** Ein Studi */ 4 | public record Studi(String name, int credits) {} 5 | -------------------------------------------------------------------------------- /lecture/java-modern/src/optional/teaser/Demo.java: -------------------------------------------------------------------------------- 1 | package optional.teaser; 2 | 3 | /** Teaser für die Folien */ 4 | public class Demo { 5 | /** Just to please Checkstyle */ 6 | public static void main(String... args) { 7 | LSF lsf = new LSF(); 8 | 9 | Studi holger = new Studi("Holger", 7); 10 | Studi anne = new Studi("Anne", 42); 11 | 12 | lsf.anmelden(holger); 13 | lsf.anmelden(anne); 14 | 15 | Studi best = lsf.getBestStudi(); 16 | if (best != null) { 17 | // mach was mit dem Studi ... 18 | String name = best.name(); 19 | if (name != null) { 20 | // mach was mit dem Namen ... 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lecture/java-modern/src/optional/teaser/LSF.java: -------------------------------------------------------------------------------- 1 | package optional.teaser; 2 | 3 | import java.util.HashSet; 4 | import java.util.Set; 5 | 6 | /** Modellierung des LSF */ 7 | public class LSF { 8 | private final Set sl = new HashSet<>(); 9 | 10 | /** Anmelden eines Studis */ 11 | public boolean anmelden(Studi s) { 12 | return sl.add(s); 13 | } 14 | 15 | /** Abmelden eines Studis */ 16 | public boolean abmelden(Studi s) { 17 | return sl.remove(s); 18 | } 19 | 20 | /** Finde den Studi mit den meisten Credits */ 21 | public Studi getBestStudi() { 22 | if (sl == null) return null; // Fehler: Es gibt noch keine Sammlung 23 | 24 | Studi best = null; 25 | for (Studi s : sl) { 26 | if (best == null) best = s; 27 | if (best.credits() < s.credits()) best = s; 28 | } 29 | 30 | return best; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lecture/java-modern/src/optional/teaser/Studi.java: -------------------------------------------------------------------------------- 1 | package optional.teaser; 2 | 3 | /** Ein Studi */ 4 | public record Studi(String name, int credits) {} 5 | -------------------------------------------------------------------------------- /lecture/java-modern/src/optional/traditional/Studi.java: -------------------------------------------------------------------------------- 1 | package optional.traditional; 2 | 3 | /** Ein Studi */ 4 | public record Studi(String name, int credits) {} 5 | -------------------------------------------------------------------------------- /lecture/java-modern/src/records/DemoRecords.java: -------------------------------------------------------------------------------- 1 | package records; 2 | 3 | /** Studi: Klasse vs. Record */ 4 | public class DemoRecords { 5 | /** Just to please Checkstyle */ 6 | public static void main(String... args) { 7 | Studi s = new Studi("Holger", 42); 8 | StudiR r = new StudiR("Sabine", 75); 9 | 10 | int x = r.credits(); 11 | String y = r.name(); 12 | 13 | StudiT t = new StudiT("ugh", 1); 14 | int credits = t.credits(); 15 | t.wuppie(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lecture/java-modern/src/records/Studi.java: -------------------------------------------------------------------------------- 1 | package records; 2 | 3 | /** Modellieren wir einen Studi (als Klasse) */ 4 | public class Studi { 5 | private final String name; 6 | private final int credits; 7 | 8 | /** 9 | * Konstruktor: Baue einen neuen Studi 10 | * 11 | * @param name Name des neuen Studis 12 | * @param credits Credits des neuen Studis 13 | */ 14 | public Studi(String name, int credits) { 15 | this.name = name; 16 | this.credits = credits; 17 | } 18 | 19 | /** Wie heisse ich? */ 20 | public String getName() { 21 | return name; 22 | } 23 | 24 | /** Wieviele Credits habe ich? */ 25 | public int getCredits() { 26 | return credits; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lecture/java-modern/src/records/StudiR.java: -------------------------------------------------------------------------------- 1 | package records; 2 | 3 | /** Modellieren wir einen Studi (als Record) */ 4 | public record StudiR(String name, int credits) {} 5 | -------------------------------------------------------------------------------- /lecture/java-modern/src/records/StudiS.java: -------------------------------------------------------------------------------- 1 | package records; 2 | 3 | /** Modellieren wir einen Studi (als Record) */ 4 | public record StudiS(String name, int credits) { 5 | public StudiS(String name, int credits) { 6 | if (name == null) { 7 | throw new IllegalArgumentException("Name cannot be null!"); 8 | } else { 9 | this.name = name; 10 | } 11 | if (credits < 0) { 12 | this.credits = 0; 13 | } else { 14 | this.credits = credits; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lecture/java-modern/src/records/StudiT.java: -------------------------------------------------------------------------------- 1 | package records; 2 | 3 | /** Modellieren wir einen Studi (als Record) */ 4 | public record StudiT(String name, int credits) { 5 | public StudiT { 6 | if (name == null) { 7 | throw new IllegalArgumentException("Name cannot be null!"); 8 | } 9 | if (credits < 0) { 10 | credits = 0; 11 | } 12 | } 13 | 14 | public StudiT() { 15 | this("", 42); 16 | } 17 | 18 | public int credits() { 19 | return credits + 42; 20 | } 21 | 22 | public void wuppie() { 23 | System.out.println("WUPPIE"); 24 | } 25 | 26 | public void nope() { 27 | // credits = credits + 42; // Nicht erlaubt! 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lecture/java-modern/src/streams/Fachbereich.java: -------------------------------------------------------------------------------- 1 | package streams; 2 | 3 | import java.util.List; 4 | 5 | /** Ein Fachbereich */ 6 | public record Fachbereich(String name, List studiengaenge) {} 7 | -------------------------------------------------------------------------------- /lecture/java-modern/src/streams/LSF.java: -------------------------------------------------------------------------------- 1 | package streams; 2 | 3 | import java.util.HashSet; 4 | import java.util.Set; 5 | 6 | /** Modellierung des LSF */ 7 | public class LSF { 8 | private final Set sl = new HashSet<>(); 9 | 10 | /** Anmelden eines Studis */ 11 | public boolean anmelden(Studi s) { 12 | return sl.add(s); 13 | } 14 | 15 | /** Abmelden eines Studis */ 16 | public boolean abmelden(Studi s) { 17 | return sl.remove(s); 18 | } 19 | 20 | /** Finde den Studi mit den meisten Credits */ 21 | public Studi getBestStudi() { 22 | if (sl == null) return null; // Fehler: Es gibt noch keine Sammlung 23 | 24 | Studi best = null; 25 | for (Studi s : sl) { 26 | if (best == null) best = s; 27 | if (best.credits() < s.credits()) best = s; 28 | } 29 | 30 | return best; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lecture/java-modern/src/streams/Studi.java: -------------------------------------------------------------------------------- 1 | package streams; 2 | 3 | /** Ein Studi */ 4 | public record Studi(String name, int credits) {} 5 | -------------------------------------------------------------------------------- /lecture/java-modern/src/streams/Studiengang.java: -------------------------------------------------------------------------------- 1 | package streams; 2 | 3 | import java.util.List; 4 | 5 | /** Ein Studiengang */ 6 | public record Studiengang(String name, List studis) {} 7 | -------------------------------------------------------------------------------- /lecture/misc/images/checklisteMotivation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/misc/images/checklisteMotivation.png -------------------------------------------------------------------------------- /lecture/misc/images/checklisteMotivationFarbig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/misc/images/checklisteMotivationFarbig.png -------------------------------------------------------------------------------- /lecture/misc/images/frameworksVSlib.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/misc/images/frameworksVSlib.png -------------------------------------------------------------------------------- /lecture/misc/images/screenshot_dungeon_clone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/misc/images/screenshot_dungeon_clone.png -------------------------------------------------------------------------------- /lecture/misc/images/screenshot_dungeon_defaultlevel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/misc/images/screenshot_dungeon_defaultlevel.png -------------------------------------------------------------------------------- /lecture/misc/images/screenshot_dungeon_import_intellij.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/misc/images/screenshot_dungeon_import_intellij.png -------------------------------------------------------------------------------- /lecture/misc/images/screenshot_dungeon_import_intellij_asgradle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/misc/images/screenshot_dungeon_import_intellij_asgradle.png -------------------------------------------------------------------------------- /lecture/misc/images/screenshot_dungeon_intellij_gradle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/misc/images/screenshot_dungeon_intellij_gradle.png -------------------------------------------------------------------------------- /lecture/misc/readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Verschiedenes" 3 | no_pdf: true 4 | no_beamer: true 5 | --- 6 | -------------------------------------------------------------------------------- /lecture/misc/src/dungeon/demo/WalkerComponent.java: -------------------------------------------------------------------------------- 1 | package demo; 2 | 3 | import core.Component; 4 | 5 | public class WalkerComponent implements Component {} 6 | -------------------------------------------------------------------------------- /lecture/misc/src/dungeon/demo/WalkerSystem.java: -------------------------------------------------------------------------------- 1 | package demo; 2 | 3 | import core.System; 4 | import core.components.VelocityComponent; 5 | 6 | public class WalkerSystem extends System { 7 | public WalkerSystem() { 8 | super(WalkerComponent.class); 9 | } 10 | 11 | @Override 12 | public void execute() { 13 | entityStream() 14 | .forEach( 15 | e -> { 16 | if (e.isPresent(WalkerComponent.class)) { 17 | VelocityComponent vc = e.fetch(VelocityComponent.class).get(); 18 | vc.currentXVelocity(vc.xVelocity()); 19 | vc.currentYVelocity(vc.yVelocity()); 20 | } 21 | }); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lecture/misc/src/dungeon/notes.txt: -------------------------------------------------------------------------------- 1 | Diesen Source-Tree in das Sub-Projekt "game" vom Dungeon-Projekt legen zum Ausführen. 2 | 3 | Zusätzlich muss noch die Konstante FIRST_SKILL in game/src/core/configuration/KeyboardConfig.java ergänzt werden: 4 | 5 | public static final ConfigKey FIRST_SKILL = new ConfigKey<>(new String[] {"foo", "bar"}, new ConfigIntValue(Input.Keys.Q)); 6 | 7 | 8 | -------------------------------------------------------------------------------- /lecture/misc/src/javalin/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id "com.diffplug.spotless" version "6.5.0" 4 | } 5 | 6 | repositories { 7 | mavenCentral() 8 | } 9 | 10 | dependencies { 11 | implementation 'io.javalin:javalin:4.5.0' 12 | implementation 'org.slf4j:slf4j-simple:1.8.0-beta4' 13 | } 14 | 15 | spotless { 16 | java { 17 | googleJavaFormat().aosp() 18 | } 19 | } 20 | 21 | task javalinHelloWorld(dependsOn: classes, type: JavaExec) { 22 | mainClass = "JavalinHelloWorld" 23 | classpath = sourceSets.main.runtimeClasspath 24 | } 25 | 26 | task javalinRandomNumber(dependsOn: classes, type: JavaExec) { 27 | mainClass = "JavalinRandomNumber" 28 | classpath = sourceSets.main.runtimeClasspath 29 | } 30 | -------------------------------------------------------------------------------- /lecture/misc/src/javalin/gradle.properties: -------------------------------------------------------------------------------- 1 | 2 | org.gradle.daemon=true 3 | org.gradle.configureondemand=false 4 | org.gradle.jvmargs=-Xms128m -Xmx2048m \ 5 | --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \ 6 | --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \ 7 | --add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \ 8 | --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \ 9 | --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED 10 | # The "add-exports" options are a workaround to use the "google-java-format" plugin with Java 17 and Gradle 7.2. 11 | # See also here: 12 | # https://github.com/google/google-java-format#jdk-16 13 | # https://github.com/diffplug/spotless/tree/main/plugin-gradle#google-java-format -------------------------------------------------------------------------------- /lecture/misc/src/javalin/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/misc/src/javalin/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lecture/misc/src/javalin/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /lecture/pattern/images/command.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/command.png -------------------------------------------------------------------------------- /lecture/pattern/images/composite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/composite.png -------------------------------------------------------------------------------- /lecture/pattern/images/factorymethod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/factorymethod.png -------------------------------------------------------------------------------- /lecture/pattern/images/flyweight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/flyweight.png -------------------------------------------------------------------------------- /lecture/pattern/images/hunde.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/hunde.png -------------------------------------------------------------------------------- /lecture/pattern/images/hunde_strat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/hunde_strat.png -------------------------------------------------------------------------------- /lecture/pattern/images/lsf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/lsf.png -------------------------------------------------------------------------------- /lecture/pattern/images/observer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/observer.png -------------------------------------------------------------------------------- /lecture/pattern/images/observerexample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/observerexample.png -------------------------------------------------------------------------------- /lecture/pattern/images/parsetree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/parsetree.png -------------------------------------------------------------------------------- /lecture/pattern/images/parsetree_classes_uml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/parsetree_classes_uml.png -------------------------------------------------------------------------------- /lecture/pattern/images/parsetree_eval_print_uml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/parsetree_eval_print_uml.png -------------------------------------------------------------------------------- /lecture/pattern/images/parsetree_eval_uml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/parsetree_eval_uml.png -------------------------------------------------------------------------------- /lecture/pattern/images/parsetree_visitor_uml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/parsetree_visitor_uml.png -------------------------------------------------------------------------------- /lecture/pattern/images/template-method.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/template-method.png -------------------------------------------------------------------------------- /lecture/pattern/images/translator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/translator.png -------------------------------------------------------------------------------- /lecture/pattern/images/visitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/pattern/images/visitor.png -------------------------------------------------------------------------------- /lecture/pattern/readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Entwurfsmuster" 3 | no_pdf: true 4 | no_beamer: true 5 | --- 6 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/command/Cursor.java: -------------------------------------------------------------------------------- 1 | package challenges.command; 2 | 3 | import java.util.logging.Logger; 4 | 5 | public class Cursor { 6 | private Position p; 7 | private Logger logger; 8 | 9 | public Cursor(int x, int y) { 10 | this.p = new Position(x,y); 11 | this.logger = Logger.getLogger(this.getClass().getName()); 12 | } 13 | 14 | /** 15 | * Moves the Cursor to the Position given 16 | * @param p the new Position where the Cursor should be placed at 17 | */ 18 | public void move(Position p) { 19 | this.p.x = p.x; 20 | this.p.y = p.y; 21 | logger.info("Die aktuelle Position des Cursors ist: " + this.p); 22 | } 23 | 24 | /** 25 | * 26 | * @return returns the current Position of the Cursor 27 | */ 28 | public Position getPosition() { 29 | return p; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/command/Direction.java: -------------------------------------------------------------------------------- 1 | package challenges.command; 2 | 3 | public enum Direction { 4 | left, 5 | right 6 | } 7 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/command/Dwarf.java: -------------------------------------------------------------------------------- 1 | package challenges.command; 2 | 3 | import java.util.logging.Logger; 4 | 5 | public class Dwarf { 6 | private int x; 7 | private int jumpcount = 0; 8 | private Logger logger; 9 | 10 | /** 11 | * Erstellt einen Zwerg 12 | */ 13 | public Dwarf() { 14 | logger = Logger.getLogger(this.getClass().getName()); 15 | } 16 | 17 | /** 18 | * Bewegt den Zwerg entlang der X-Achse in die Richtung die Angegeben wurde. 19 | * @param dir in welche sich der Zwerg bewegen soll. 20 | */ 21 | public void moveX(Direction dir) { 22 | x += dir == Direction.left ? -10 : +10; 23 | logger.info("Neue Position des Zwerges = " + x); 24 | } 25 | 26 | /** 27 | * Simuliert das der Zwerg springt. 28 | */ 29 | public void jump() { 30 | jumpcount++; 31 | logger.info("Zwerg ist bereits " + jumpcount + " mal gesprungen."); 32 | } 33 | 34 | /** 35 | * Simuliert das sich der Zwerg duckt. 36 | */ 37 | public void duck() { 38 | logger.info("Der Zwerg duckt sich!"); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/command/Key.java: -------------------------------------------------------------------------------- 1 | package challenges.command; 2 | 3 | public enum Key { 4 | W, 5 | A, 6 | S, 7 | D 8 | } 9 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/command/Position.java: -------------------------------------------------------------------------------- 1 | package challenges.command; 2 | 3 | public final class Position { 4 | public int x, y; 5 | 6 | /** 7 | * Basis Konstruktor welcher x und y mit 0 initialisiert 8 | */ 9 | public Position() { 10 | this(0, 0); 11 | } 12 | 13 | /** 14 | * Konstruktor welcher x und y mit den angegebenen Werten initialisiert. 15 | * @param x 16 | * @param y 17 | */ 18 | public Position(int x, int y) { 19 | this.x = x; 20 | this.y = y; 21 | } 22 | 23 | /** 24 | * Erstellt eine String representation von dem Position Objekt im Format [x={x}, y={y}]. 25 | * @return die String representation 26 | */ 27 | @Override 28 | public String toString() { 29 | return "[" + "x=" + x + ", y=" + y + ']'; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/flyweight/Main.java: -------------------------------------------------------------------------------- 1 | package challenges.flyweight; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Brett brett = Brett.erstelleNeuesSchachBrett(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/flyweight/Position.java: -------------------------------------------------------------------------------- 1 | package challenges.flyweight; 2 | 3 | public class Position { 4 | public int x, y; 5 | 6 | public Position(int x, int y) { 7 | this.x = x; 8 | this.y = y; 9 | } 10 | 11 | @Override 12 | public String toString() { 13 | return "Position{" + 14 | "X=" + x + 15 | ", Y=" + y + 16 | '}'; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/flyweight/Typ.java: -------------------------------------------------------------------------------- 1 | package challenges.flyweight; 2 | 3 | public class Typ { 4 | String name; 5 | String bildpfad; 6 | byte[] texture; 7 | 8 | public Typ(String name, String bildpfad, byte[] texture) { 9 | this.name = name; 10 | this.bildpfad = bildpfad; 11 | this.texture = texture; 12 | } 13 | 14 | @Override 15 | public String toString() { 16 | return "Typ{" 17 | + "name='" 18 | + name 19 | + '\'' 20 | + ", bildpfad='" 21 | + bildpfad 22 | + '\'' 23 | + ", texture[0]=" 24 | + texture[0] 25 | + '}'; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/observer/Auftrag.java: -------------------------------------------------------------------------------- 1 | package challenges.observer; 2 | 3 | class Auftrag { 4 | private WarenTyp warenTyp; 5 | private int anzahl; 6 | 7 | public Auftrag(WarenTyp warenTyp, int anzahl) { 8 | if(warenTyp == null){ 9 | throw new IllegalArgumentException("Warentyp darf nicht null sein."); 10 | } 11 | if(anzahl <= 0){ 12 | throw new IllegalArgumentException("Die Menge muss größer als 0 sein."); 13 | } 14 | this.warenTyp = warenTyp; 15 | this.anzahl = anzahl; 16 | } 17 | 18 | public WarenTyp getWarenTyp() { 19 | return warenTyp; 20 | } 21 | 22 | public int getAnzahl() { 23 | return anzahl; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/observer/Main.java: -------------------------------------------------------------------------------- 1 | package challenges.observer; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Grosshandel ghandel = new Grosshandel(); 6 | Einzelhandel handel1 = new Einzelhandel(ghandel); 7 | Einzelhandel handel2 = new Einzelhandel(ghandel); 8 | 9 | handel1.bestellen(new Auftrag(WarenTyp.Batterien, 2)); 10 | handel1.bestellen(new Auftrag(WarenTyp.Bretter, 2)); 11 | handel2.bestellen(new Auftrag(WarenTyp.Batterien, 2)); 12 | handel2.bestellen(new Auftrag(WarenTyp.Farbeimer, 2)); 13 | while (handel1.hatAuftraege() || handel2.hatAuftraege()) { 14 | ghandel.loop(); 15 | handel1.loop(); 16 | handel2.loop(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/observer/WarenTyp.java: -------------------------------------------------------------------------------- 1 | package challenges.observer; 2 | 3 | public enum WarenTyp { 4 | Bretter, Batterien, Farbeimer 5 | } 6 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/visitor/BinaryNode.java: -------------------------------------------------------------------------------- 1 | package challenges.visitor; 2 | 3 | /** 4 | * A node representing a binary tree. 5 | * 6 | * @param data item to store in this node 7 | * @param left left child of this node 8 | * @param right right child of this node 9 | * @param parametric type of the tree elements 10 | */ 11 | public record BinaryNode(T data, BinaryNode left, BinaryNode right) implements Node { 12 | 13 | @Override 14 | public T accept(NodeVisitor visitor) { 15 | throw new UnsupportedOperationException(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/visitor/Node.java: -------------------------------------------------------------------------------- 1 | package challenges.visitor; 2 | 3 | /** 4 | * Common interface of all nodes: accept a visitor. 5 | * 6 | * @param parametric type of the tree elements 7 | */ 8 | public interface Node { 9 | 10 | /** 11 | * Accept a visitor. 12 | * 13 | * @param visitor to accept 14 | * @return the result of visiting the node (recursively) 15 | */ 16 | T accept(NodeVisitor visitor); 17 | } 18 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/visitor/NodeVisitor.java: -------------------------------------------------------------------------------- 1 | package challenges.visitor; 2 | 3 | /** 4 | * Visitor pattern for a search tree. 5 | * 6 | * @param parametric type of the tree elements 7 | */ 8 | public interface NodeVisitor { 9 | 10 | /** 11 | * Visit an unary search tree (leaf). 12 | * 13 | * @param node to visit 14 | * @return the result of visiting the node (recursively) 15 | */ 16 | T visit(UnaryNode node); 17 | 18 | /** 19 | * Visit a binary search tree. 20 | * 21 | * @param node to visit 22 | * @return the result of visiting the node (recursively) 23 | */ 24 | T visit(BinaryNode node); 25 | } 26 | -------------------------------------------------------------------------------- /lecture/pattern/src/challenges/visitor/UnaryNode.java: -------------------------------------------------------------------------------- 1 | package challenges.visitor; 2 | 3 | /** 4 | * A node representing a unary tree: just a leaf. 5 | * 6 | * @param data item to store in this node 7 | * @param parametric type of the tree elements 8 | */ 9 | public record UnaryNode(T data) implements Node { 10 | 11 | @Override 12 | public T accept(NodeVisitor visitor) { 13 | throw new UnsupportedOperationException(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lecture/pattern/src/command/sketch/Buttons.java: -------------------------------------------------------------------------------- 1 | package command.sketch; 2 | 3 | enum Buttons { 4 | BUTTON_W, 5 | BUTTON_A, 6 | BUTTON_S, 7 | BUTTON_D 8 | } 9 | -------------------------------------------------------------------------------- /lecture/pattern/src/command/sketch/Command.java: -------------------------------------------------------------------------------- 1 | package command.sketch; 2 | 3 | public interface Command { 4 | void execute(); 5 | } 6 | -------------------------------------------------------------------------------- /lecture/pattern/src/command/sketch/Entity.java: -------------------------------------------------------------------------------- 1 | package command.sketch; 2 | 3 | public interface Entity { 4 | void jump(); 5 | 6 | void moveX(); 7 | } 8 | -------------------------------------------------------------------------------- /lecture/pattern/src/command/sketch/Hero.java: -------------------------------------------------------------------------------- 1 | package command.sketch; 2 | 3 | public class Hero implements Entity { 4 | @Override 5 | public void jump() { 6 | // do jump! 7 | } 8 | 9 | @Override 10 | public void moveX() { 11 | // do move in x-direction ... 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lecture/pattern/src/command/sketch/InputHandler.java: -------------------------------------------------------------------------------- 1 | package command.sketch; 2 | 3 | /** Beispielcode für die Folien */ 4 | public class InputHandler { 5 | private final Entity hero = new Hero(); 6 | 7 | public void handleInput() { 8 | switch (isPressed()) { 9 | case BUTTON_W -> hero.jump(); 10 | case BUTTON_A -> hero.moveX(); 11 | default -> {} 12 | } 13 | } 14 | 15 | private Buttons isPressed() { 16 | return Buttons.BUTTON_W; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lecture/pattern/src/command/sketch/InputHandler2.java: -------------------------------------------------------------------------------- 1 | package command.sketch; 2 | 3 | /** Beispielcode für die Folien */ 4 | public class InputHandler2 { 5 | private final Command wbutton; 6 | private final Command abutton; 7 | 8 | public InputHandler2(Command wbutton, Command abutton) { 9 | this.wbutton = wbutton; 10 | this.abutton = abutton; 11 | } 12 | 13 | public void handleInput() { 14 | switch (isPressed()) { 15 | case BUTTON_W -> wbutton.execute(); 16 | case BUTTON_A -> abutton.execute(); 17 | default -> {} 18 | } 19 | } 20 | 21 | private Buttons isPressed() { 22 | return Buttons.BUTTON_W; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lecture/pattern/src/command/sketch/Jump.java: -------------------------------------------------------------------------------- 1 | package command.sketch; 2 | 3 | public class Jump implements Command { 4 | private Entity e; 5 | 6 | public Jump() { 7 | this(null); 8 | } 9 | 10 | public Jump(Entity e) { 11 | this.e = e; 12 | } 13 | 14 | @Override 15 | public void execute() { 16 | e.jump(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lecture/pattern/src/command/undo/Buttons.java: -------------------------------------------------------------------------------- 1 | package command.undo; 2 | 3 | enum Buttons { 4 | BUTTON_W, 5 | BUTTON_A, 6 | BUTTON_S, 7 | BUTTON_U, 8 | BUTTON_D 9 | } 10 | -------------------------------------------------------------------------------- /lecture/pattern/src/command/undo/Command.java: -------------------------------------------------------------------------------- 1 | package command.undo; 2 | 3 | public interface Command { 4 | void execute(); 5 | 6 | Command newCommand(Entity e); 7 | 8 | void undo(); 9 | } 10 | -------------------------------------------------------------------------------- /lecture/pattern/src/command/undo/Entity.java: -------------------------------------------------------------------------------- 1 | package command.undo; 2 | 3 | public interface Entity { 4 | void jump(); 5 | 6 | void moveTo(int x, int y); 7 | 8 | int getX(); 9 | 10 | int getY(); 11 | } 12 | -------------------------------------------------------------------------------- /lecture/pattern/src/command/undo/Hero.java: -------------------------------------------------------------------------------- 1 | package command.undo; 2 | 3 | public class Hero implements Entity { 4 | @Override 5 | public void jump() { 6 | // do jump! 7 | } 8 | 9 | @Override 10 | public void moveTo(int x, int y) { 11 | // do move to (x,y) 12 | } 13 | 14 | @Override 15 | public int getX() { 16 | return 0; 17 | } 18 | 19 | @Override 20 | public int getY() { 21 | return 0; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lecture/pattern/src/command/undo/Jump.java: -------------------------------------------------------------------------------- 1 | package command.undo; 2 | 3 | public class Jump implements Command { 4 | private Entity e; 5 | 6 | public Jump() { 7 | this(null); 8 | } 9 | 10 | public Jump(Entity e) { 11 | this.e = e; 12 | } 13 | 14 | @Override 15 | public void execute() { 16 | e.jump(); 17 | } 18 | 19 | @Override 20 | public Command newCommand(Entity e) { 21 | return new Jump(e); 22 | } 23 | 24 | @Override 25 | public void undo() { 26 | // noop 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lecture/pattern/src/command/undo/Move.java: -------------------------------------------------------------------------------- 1 | package command.undo; 2 | 3 | public class Move implements Command { 4 | private Entity e; 5 | private int x; 6 | private int y; 7 | private int oldX; 8 | private int oldY; 9 | 10 | public Move() { 11 | this(null); 12 | x = 0; 13 | y = 0; 14 | oldX = 0; 15 | oldY = 0; 16 | } 17 | 18 | public Move(Entity e) { 19 | this.e = e; 20 | x = 0; 21 | y = 0; 22 | oldX = 0; 23 | oldY = 0; 24 | } 25 | 26 | @Override 27 | public void execute() { 28 | oldX = e.getX(); 29 | oldY = e.getY(); 30 | x = oldX + 42; 31 | y = oldY; 32 | e.moveTo(x, y); 33 | } 34 | 35 | @Override 36 | public Command newCommand(Entity e) { 37 | return new Move(e); 38 | } 39 | 40 | @Override 41 | public void undo() { 42 | e.moveTo(oldX, oldY); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /lecture/pattern/src/factory/FactoryBeispiel.java: -------------------------------------------------------------------------------- 1 | package factory; 2 | 3 | abstract class Ticket { 4 | } 5 | 6 | class KurzStrecke extends Ticket { 7 | } 8 | 9 | class SemesterTicket extends Ticket { 10 | } 11 | 12 | public class FactoryBeispiel { 13 | // private: kann von aussen nicht benutzt werden 14 | private FactoryBeispiel() { 15 | } 16 | 17 | // neue Objekte gibt es (nur) hiermit 18 | public static Ticket getTicket(String wunsch, int cent) { 19 | if (wunsch.matches("Kurz.*") && cent == 240) { 20 | return new KurzStrecke(); 21 | } 22 | if (wunsch.matches("Sem.*|Studi.*") && cent == 5600) { 23 | return new SemesterTicket(); 24 | } 25 | // Bad Smell: returning "null" instead of "Ticket" 26 | return null; 27 | } 28 | 29 | public static void main(String[] args) { 30 | Ticket bsp = FactoryBeispiel.getTicket("Kurz", 240); 31 | System.out.println(bsp); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lecture/pattern/src/observer/LSF.java: -------------------------------------------------------------------------------- 1 | package observer; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import java.util.logging.Logger; 6 | 7 | public class LSF { 8 | private static final Logger LOGGER = Logger.getLogger(LSF.class.getName()); 9 | private final List observers = new ArrayList<>(); 10 | 11 | public void register(Observer o) { 12 | LOGGER.info("adding observer"); 13 | observers.add(o); 14 | } 15 | 16 | public void notifyObservers() { 17 | LOGGER.info("notifying all observers"); 18 | for (Observer o : observers) { 19 | o.update(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lecture/pattern/src/observer/Lecturer.java: -------------------------------------------------------------------------------- 1 | package observer; 2 | 3 | import java.util.logging.Logger; 4 | 5 | public class Lecturer extends Person implements Observer { 6 | private static final Logger LOGGER = Logger.getLogger(Lecturer.class.getName()); 7 | 8 | public Lecturer(String name) { 9 | super(name); 10 | } 11 | 12 | @Override 13 | public void update() { 14 | LOGGER.info(name + " has been notified"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lecture/pattern/src/observer/Observer.java: -------------------------------------------------------------------------------- 1 | package observer; 2 | 3 | public interface Observer { 4 | void update(); 5 | } 6 | -------------------------------------------------------------------------------- /lecture/pattern/src/observer/ObserverBeispiel.java: -------------------------------------------------------------------------------- 1 | package observer; 2 | 3 | public class ObserverBeispiel { 4 | public static void main(String[] args) { 5 | Observer[] people = {new Lecturer("Frau Holle"), 6 | new Student("Heinz"), 7 | new Student("Karla"), 8 | new Tutor("Kolja"), 9 | new Student("Wuppie")}; 10 | 11 | LSF lsf = new LSF(); 12 | for (Observer p : people) { 13 | lsf.register(p); 14 | } 15 | 16 | lsf.notifyObservers(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lecture/pattern/src/observer/Person.java: -------------------------------------------------------------------------------- 1 | package observer; 2 | 3 | public abstract class Person { 4 | protected final String name; 5 | 6 | Person(String name) { 7 | this.name = name; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lecture/pattern/src/observer/Student.java: -------------------------------------------------------------------------------- 1 | package observer; 2 | 3 | import java.util.logging.Logger; 4 | 5 | public class Student extends Person implements Observer { 6 | private static final Logger LOGGER = Logger.getLogger(Student.class.getName()); 7 | 8 | public Student(String name) { 9 | super(name); 10 | } 11 | 12 | @Override 13 | public void update() { 14 | LOGGER.info(name + " has been notified"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lecture/pattern/src/observer/Tutor.java: -------------------------------------------------------------------------------- 1 | package observer; 2 | 3 | import java.util.logging.Logger; 4 | 5 | public class Tutor extends Student implements Observer { 6 | private static final Logger LOGGER = Logger.getLogger(Tutor.class.getName()); 7 | 8 | public Tutor(String name) { 9 | super(name); 10 | } 11 | 12 | @Override 13 | public void update() { 14 | LOGGER.info(name + " has been notified"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lecture/pattern/src/singleton/SingletonEager.java: -------------------------------------------------------------------------------- 1 | package singleton; 2 | 3 | /** 4 | * Demonstration einer häufig verwendeten Ausprägung des Singleton-Patterns: "Eager Singleton": 5 | * Die Instanz der Klasse wird direkt beim Laden durch JVM angelegt. 6 | */ 7 | public class SingletonEager { 8 | private static final SingletonEager inst = new SingletonEager(); 9 | 10 | // Privater Constructor: Niemand kann Objekte außerhalb der Klasse anlegen 11 | private SingletonEager() {} 12 | 13 | public static SingletonEager getInst() { 14 | return inst; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lecture/pattern/src/singleton/SingletonLazy.java: -------------------------------------------------------------------------------- 1 | package singleton; 2 | 3 | /** 4 | * Demonstration einer häufig verwendeten Ausprägung des Singleton-Patterns: "Lazy Singleton": 5 | * Die Instanz der Klasse wird erst bei Bedarf erzeugt. 6 | */ 7 | public class SingletonLazy { 8 | private static SingletonLazy inst = null; 9 | 10 | // Privater Constructor: Niemand kann Objekte außerhalb der Klasse anlegen 11 | private SingletonLazy() {} 12 | 13 | public static SingletonLazy getInst() { 14 | synchronized (SingletonLazy.class) { // Thread-safe. Kann weggelassen werden bei Single-Threaded-Gebrauch 15 | if (inst == null) { 16 | inst = new SingletonLazy(); 17 | } 18 | } 19 | return inst; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lecture/pattern/src/strategy/SortDefault.java: -------------------------------------------------------------------------------- 1 | package strategy; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | 7 | public class SortDefault { 8 | public static void main(String[] args) { 9 | List list = new ArrayList(); 10 | 11 | list.add(new Studi("Klaas")); 12 | list.add(new Studi("Hein")); 13 | list.add(new Studi("Pit")); 14 | 15 | // Sortieren der Liste (Standard-Reihenfolge, definiert in Studi#compareTo) 16 | Collections.sort(list); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lecture/pattern/src/strategy/SortOwnCrit.java: -------------------------------------------------------------------------------- 1 | package strategy; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.Comparator; 6 | import java.util.List; 7 | 8 | public class SortOwnCrit { 9 | public static void main(String[] args) { 10 | List list = new ArrayList(); 11 | 12 | list.add(new Studi("Klaas")); 13 | list.add(new Studi("Hein")); 14 | list.add(new Studi("Pit")); 15 | 16 | // Sortieren der Liste (eigene Reihenfolge, prinzipiell unabhaengig zu 17 | // Studi#compareTo) 18 | Comparator c = new Comparator() { 19 | @Override 20 | public int compare(Studi o1, Studi o2) { 21 | return o1.compareTo(o2); // hier Kriterium fuer eigene Ordnung definieren 22 | } 23 | }; 24 | 25 | list.sort(c); 26 | Collections.sort(list, c); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lecture/pattern/src/strategy/Studi.java: -------------------------------------------------------------------------------- 1 | package strategy; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class Studi implements Comparable { 7 | private final String name; 8 | 9 | public Studi(String name) { 10 | this.name = name; 11 | } 12 | 13 | public static void main(String[] args) { 14 | List list = new ArrayList(); 15 | 16 | list.add(new Studi("Klaas")); 17 | list.add(new Studi("Hein")); 18 | list.add(new Studi("Pit")); 19 | 20 | // Sortieren der Liste (Standard-Reihenfolge)?! 21 | // Sortieren der Liste (eigene Reihenfolge)?! 22 | } 23 | 24 | @Override 25 | public int compareTo(Studi o) { 26 | return this.name.compareTo(o.name); // hier Kriterium fuer eigene Ordnung definieren 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/direct/AddExpr.java: -------------------------------------------------------------------------------- 1 | package visitor.direct; 2 | 3 | /** Zusammengesetzter Ausdruck: Addition zweier Ausdrücke */ 4 | public class AddExpr implements Expr { 5 | private final Expr e1; 6 | private final Expr e2; 7 | 8 | /** Erzeuge eine neue MulExpr-Instanz */ 9 | public AddExpr(Expr e1, Expr e2) { 10 | this.e1 = e1; 11 | this.e2 = e2; 12 | } 13 | 14 | @Override 15 | public int eval() { 16 | return e1.eval() + e2.eval(); 17 | } 18 | 19 | @Override 20 | public String print() { 21 | return "AddExpr(" + e1.print() + ", " + e2.print() + ")"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/direct/DemoExpr.java: -------------------------------------------------------------------------------- 1 | package visitor.direct; 2 | 3 | /** Demo: Parsetree (OHNE Visitor-Pattern) */ 4 | public class DemoExpr { 5 | /** Just to please Checkstyle */ 6 | public static void main(final String... args) { 7 | // 5*4+3 8 | Expr e = new AddExpr(new MulExpr(new NumExpr(5), new NumExpr(4)), new NumExpr(3)); 9 | 10 | int erg = e.eval(); 11 | String s = e.print(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/direct/Expr.java: -------------------------------------------------------------------------------- 1 | package visitor.direct; 2 | 3 | /** Schnittstelle für einen Ausdruck */ 4 | public interface Expr { 5 | /** Werte den Ausdruck aus */ 6 | int eval(); 7 | 8 | /** Erzeuge eine String-Repräsentation des Ausdrucks */ 9 | String print(); 10 | } 11 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/direct/MulExpr.java: -------------------------------------------------------------------------------- 1 | package visitor.direct; 2 | 3 | /** Zusammengesetzter Ausdruck: Multiplikation zweier Ausdrücke */ 4 | public class MulExpr implements Expr { 5 | private final Expr e1; 6 | private final Expr e2; 7 | 8 | /** Erzeuge eine neue MulExpr-Instanz */ 9 | public MulExpr(Expr e1, Expr e2) { 10 | this.e1 = e1; 11 | this.e2 = e2; 12 | } 13 | 14 | @Override 15 | public int eval() { 16 | return e1.eval() * e2.eval(); 17 | } 18 | 19 | @Override 20 | public String print() { 21 | return "MulExpr(" + e1.print() + ", " + e2.print() + ")"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/direct/NumExpr.java: -------------------------------------------------------------------------------- 1 | package visitor.direct; 2 | 3 | /** Einfachster Ausdruck: Ein (Integer-) Literal */ 4 | public class NumExpr implements Expr { 5 | private final int d; 6 | 7 | /** Erzeuge eine neue NumExpr-Instanz */ 8 | public NumExpr(int d) { 9 | this.d = d; 10 | } 11 | 12 | @Override 13 | public int eval() { 14 | return d; 15 | } 16 | 17 | @Override 18 | public String print() { 19 | return "NumExpr(" + d + ")"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/extrav/AddExpr.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.extrav; 2 | 3 | /** Zusammengesetzter Ausdruck: Addition zweier Ausdrücke */ 4 | public class AddExpr implements Expr { 5 | private final Expr e1; 6 | private final Expr e2; 7 | 8 | /** Erzeuge eine neue MulExpr-Instanz */ 9 | public AddExpr(Expr e1, Expr e2) { 10 | this.e1 = e1; 11 | this.e2 = e2; 12 | } 13 | 14 | @Override 15 | public void accept(ExprVisitor v) { 16 | v.visit(this); 17 | } 18 | 19 | /** Liefere das linke Kind zurück */ 20 | public Expr getE1() { 21 | return e1; 22 | } 23 | 24 | /** Liefere das rechte Kind zurück */ 25 | public Expr getE2() { 26 | return e2; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/extrav/DemoExpr.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.extrav; 2 | 3 | /** Demo: Parsetree (MIT Visitor-Pattern) */ 4 | public class DemoExpr { 5 | /** Just to please Checkstyle */ 6 | public static void main(final String... args) { 7 | // 5*4+3 8 | Expr e = new AddExpr(new MulExpr(new NumExpr(5), new NumExpr(4)), new NumExpr(3)); 9 | 10 | EvalVisitor v1 = new EvalVisitor(); 11 | e.accept(v1); 12 | int erg = v1.getResult(); 13 | 14 | PrintVisitor v2 = new PrintVisitor(); 15 | e.accept(v2); 16 | String s = v2.getResult(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/extrav/EvalVisitor.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.extrav; 2 | 3 | import static org.junit.Assume.assumeTrue; 4 | 5 | import java.util.Stack; 6 | 7 | /** Visitor zum Berechnen der Ausdrücke */ 8 | public class EvalVisitor implements ExprVisitor { 9 | private final Stack erg = new Stack<>(); 10 | 11 | @Override 12 | public void visit(NumExpr e) { 13 | erg.push(e.getValue()); 14 | } 15 | 16 | @Override 17 | public void visit(MulExpr e) { 18 | e.getE1().accept(this); 19 | e.getE1().accept(this); 20 | erg.push(erg.pop() * erg.pop()); 21 | } 22 | 23 | @Override 24 | public void visit(AddExpr e) { 25 | e.getE1().accept(this); 26 | e.getE1().accept(this); 27 | erg.push(erg.pop() + erg.pop()); 28 | } 29 | 30 | /** Liefere das Ergebnis zurück */ 31 | public int getResult() { 32 | assumeTrue(erg.size() == 1); 33 | return erg.peek(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/extrav/Expr.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.extrav; 2 | 3 | /** Schnittstelle für einen Ausdruck */ 4 | public interface Expr { 5 | /** Akzeptiere einen Visitor für die Verarbeitung */ 6 | void accept(ExprVisitor v); 7 | } 8 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/extrav/ExprVisitor.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.extrav; 2 | 3 | /** Schnittstelle für den Visitor */ 4 | public interface ExprVisitor { 5 | /** Besuche Knoten vom Typ NumExpr */ 6 | void visit(NumExpr e); 7 | 8 | /** Besuche Knoten vom Typ MulExpr */ 9 | void visit(MulExpr e); 10 | 11 | /** Besuche Knoten vom Typ AddExpr */ 12 | void visit(AddExpr e); 13 | } 14 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/extrav/MulExpr.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.extrav; 2 | 3 | /** Zusammengesetzter Ausdruck: Multiplikation zweier Ausdrücke */ 4 | public class MulExpr implements Expr { 5 | private final Expr e1; 6 | private final Expr e2; 7 | 8 | /** Erzeuge eine neue MulExpr-Instanz */ 9 | public MulExpr(Expr e1, Expr e2) { 10 | this.e1 = e1; 11 | this.e2 = e2; 12 | } 13 | 14 | @Override 15 | public void accept(ExprVisitor v) { 16 | v.visit(this); 17 | } 18 | 19 | /** Liefere das linke Kind zurück */ 20 | public Expr getE1() { 21 | return e1; 22 | } 23 | 24 | /** Liefere das rechte Kind zurück */ 25 | public Expr getE2() { 26 | return e2; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/extrav/NumExpr.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.extrav; 2 | 3 | /** Einfachster Ausdruck: Ein (Integer-) Literal */ 4 | public class NumExpr implements Expr { 5 | private final int d; 6 | 7 | /** Erzeuge eine neue NumExpr-Instanz */ 8 | public NumExpr(int d) { 9 | this.d = d; 10 | } 11 | 12 | @Override 13 | public void accept(ExprVisitor v) { 14 | v.visit(this); 15 | } 16 | 17 | /** Liefere den Wert zurück */ 18 | public int getValue() { 19 | return d; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/extrav/PrintVisitor.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.extrav; 2 | 3 | import static org.junit.Assume.assumeTrue; 4 | 5 | import java.util.Stack; 6 | 7 | /** Visitor für Pretty-Pring der Ausdrücke */ 8 | public class PrintVisitor implements ExprVisitor { 9 | private final Stack erg = new Stack<>(); 10 | 11 | @Override 12 | public void visit(NumExpr e) { 13 | erg.push("NumExpr(" + e.getValue() + ")"); 14 | } 15 | 16 | @Override 17 | public void visit(MulExpr e) { 18 | e.getE1().accept(this); 19 | e.getE1().accept(this); 20 | erg.push("MulExpr(" + erg.pop() + ", " + erg.pop() + ")"); 21 | } 22 | 23 | @Override 24 | public void visit(AddExpr e) { 25 | e.getE1().accept(this); 26 | e.getE1().accept(this); 27 | erg.push("AddExpr(" + erg.pop() + ", " + erg.pop() + ")"); 28 | } 29 | 30 | /** Liefere das Ergebnis zurück */ 31 | public String getResult() { 32 | assumeTrue(erg.size() == 1); 33 | return erg.peek(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/intrav/AddExpr.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.intrav; 2 | 3 | /** Zusammengesetzter Ausdruck: Addition zweier Ausdrücke */ 4 | public class AddExpr implements Expr { 5 | private final Expr e1; 6 | private final Expr e2; 7 | 8 | /** Erzeuge eine neue MulExpr-Instanz */ 9 | public AddExpr(Expr e1, Expr e2) { 10 | this.e1 = e1; 11 | this.e2 = e2; 12 | } 13 | 14 | @Override 15 | public void accept(ExprVisitor v) { 16 | e1.accept(v); 17 | e2.accept(v); 18 | v.visit(this); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/intrav/DemoExpr.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.intrav; 2 | 3 | /** Demo: Parsetree (MIT Visitor-Pattern) */ 4 | public class DemoExpr { 5 | /** Just to please Checkstyle */ 6 | public static void main(final String... args) { 7 | // 5*4+3 8 | Expr e = new AddExpr(new MulExpr(new NumExpr(5), new NumExpr(4)), new NumExpr(3)); 9 | 10 | EvalVisitor v1 = new EvalVisitor(); 11 | e.accept(v1); 12 | int erg = v1.getResult(); 13 | 14 | PrintVisitor v2 = new PrintVisitor(); 15 | e.accept(v2); 16 | String s = v2.getResult(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/intrav/EvalVisitor.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.intrav; 2 | 3 | import static org.junit.Assume.assumeTrue; 4 | 5 | import java.util.Stack; 6 | 7 | /** Visitor zum Berechnen der Ausdrücke */ 8 | public class EvalVisitor implements ExprVisitor { 9 | private final Stack erg = new Stack<>(); 10 | 11 | @Override 12 | public void visit(NumExpr e) { 13 | erg.push(e.getValue()); 14 | } 15 | 16 | @Override 17 | public void visit(MulExpr e) { 18 | erg.push(erg.pop() * erg.pop()); 19 | } 20 | 21 | @Override 22 | public void visit(AddExpr e) { 23 | erg.push(erg.pop() + erg.pop()); 24 | } 25 | 26 | /** Liefere das Ergebnis zurück */ 27 | public int getResult() { 28 | assumeTrue(erg.size() == 1); 29 | return erg.peek(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/intrav/Expr.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.intrav; 2 | 3 | /** Schnittstelle für einen Ausdruck */ 4 | public interface Expr { 5 | /** Akzeptiere einen Visitor für die Verarbeitung */ 6 | void accept(ExprVisitor v); 7 | } 8 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/intrav/ExprVisitor.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.intrav; 2 | 3 | /** Schnittstelle für den Visitor */ 4 | public interface ExprVisitor { 5 | /** Besuche Knoten vom Typ NumExpr */ 6 | void visit(NumExpr e); 7 | 8 | /** Besuche Knoten vom Typ MulExpr */ 9 | void visit(MulExpr e); 10 | 11 | /** Besuche Knoten vom Typ AddExpr */ 12 | void visit(AddExpr e); 13 | } 14 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/intrav/MulExpr.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.intrav; 2 | 3 | /** Zusammengesetzter Ausdruck: Multiplikation zweier Ausdrücke */ 4 | public class MulExpr implements Expr { 5 | private final Expr e1; 6 | private final Expr e2; 7 | 8 | /** Erzeuge eine neue MulExpr-Instanz */ 9 | public MulExpr(Expr e1, Expr e2) { 10 | this.e1 = e1; 11 | this.e2 = e2; 12 | } 13 | 14 | @Override 15 | public void accept(ExprVisitor v) { 16 | e1.accept(v); 17 | e2.accept(v); 18 | v.visit(this); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/intrav/NumExpr.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.intrav; 2 | 3 | /** Einfachster Ausdruck: Ein (Integer-) Literal */ 4 | public class NumExpr implements Expr { 5 | private final int d; 6 | 7 | /** Erzeuge eine neue NumExpr-Instanz */ 8 | public NumExpr(int d) { 9 | this.d = d; 10 | } 11 | 12 | @Override 13 | public void accept(ExprVisitor v) { 14 | v.visit(this); 15 | } 16 | 17 | /** Liefere den Wert zurück */ 18 | public int getValue() { 19 | return d; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lecture/pattern/src/visitor/visit/intrav/PrintVisitor.java: -------------------------------------------------------------------------------- 1 | package visitor.visit.intrav; 2 | 3 | import static org.junit.Assume.assumeTrue; 4 | 5 | import java.util.Stack; 6 | 7 | /** Visitor für Pretty-Pring der Ausdrücke */ 8 | public class PrintVisitor implements ExprVisitor { 9 | private final Stack erg = new Stack<>(); 10 | 11 | @Override 12 | public void visit(NumExpr e) { 13 | erg.push("NumExpr(" + e.getValue() + ")"); 14 | } 15 | 16 | @Override 17 | public void visit(MulExpr e) { 18 | erg.push("MulExpr(" + erg.pop() + ", " + erg.pop() + ")"); 19 | } 20 | 21 | @Override 22 | public void visit(AddExpr e) { 23 | erg.push("AddExpr(" + erg.pop() + ", " + erg.pop() + ")"); 24 | } 25 | 26 | /** Liefere das Ergebnis zurück */ 27 | public String getResult() { 28 | assumeTrue(erg.size() == 1); 29 | return erg.peek(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lecture/quality/images/aequivalenzklassen.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/images/aequivalenzklassen.odg -------------------------------------------------------------------------------- /lecture/quality/images/aequivalenzklassen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/images/aequivalenzklassen.png -------------------------------------------------------------------------------- /lecture/quality/images/grenzwerte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/images/grenzwerte.png -------------------------------------------------------------------------------- /lecture/quality/images/junitErgebnis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/images/junitErgebnis.png -------------------------------------------------------------------------------- /lecture/quality/images/junitIgnore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/images/junitIgnore.png -------------------------------------------------------------------------------- /lecture/quality/images/logging.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/images/logging.png -------------------------------------------------------------------------------- /lecture/quality/images/newJUnit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/images/newJUnit.png -------------------------------------------------------------------------------- /lecture/quality/images/swfehler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/images/swfehler.png -------------------------------------------------------------------------------- /lecture/quality/images/tdd.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/images/tdd.odg -------------------------------------------------------------------------------- /lecture/quality/images/tdd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/images/tdd.png -------------------------------------------------------------------------------- /lecture/quality/readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Softwarequalität und Testen mit JUnit und Mockito" 3 | no_pdf: true 4 | no_beamer: true 5 | --- 6 | -------------------------------------------------------------------------------- /lecture/quality/src/challenges/refactor/Article.java: -------------------------------------------------------------------------------- 1 | package challenges.refactor; 2 | 3 | public class Article { 4 | 5 | public Bike bike; 6 | public int purchaseAmount; 7 | 8 | public Article(Bike b, int pa) { 9 | bike = b; 10 | purchaseAmount = pa; 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /lecture/quality/src/challenges/refactor/Bike.java: -------------------------------------------------------------------------------- 1 | package challenges.refactor; 2 | 3 | public class Bike { 4 | 5 | public String productName; 6 | public double price; 7 | public Integer batteryCapacity; 8 | 9 | public Integer getBatteryCapacity() { 10 | return batteryCapacity; 11 | } 12 | 13 | public int getGearsCount() { 14 | throw new UnsupportedOperationException("Not Implemented"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lecture/quality/src/challenges/refactor/Brompton.java: -------------------------------------------------------------------------------- 1 | package challenges.refactor; 2 | 3 | public class Brompton extends Bike { 4 | 5 | public int maxSpeed; 6 | public int rearGearsCount; 7 | public int frontGearsCount; 8 | 9 | public Brompton(String pn, double p, int ms, int rgc, int fgc) { 10 | productName = pn; 11 | price = p; 12 | maxSpeed = ms; 13 | rearGearsCount = rgc; 14 | frontGearsCount = fgc; 15 | } 16 | 17 | public int getMaxSpeed() { 18 | return maxSpeed; 19 | } 20 | 21 | @Override 22 | public Integer getBatteryCapacity() { 23 | return null; 24 | } 25 | 26 | @Override 27 | public int getGearsCount() { 28 | return rearGearsCount * frontGearsCount; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lecture/quality/src/challenges/refactor/EBike.java: -------------------------------------------------------------------------------- 1 | package challenges.refactor; 2 | 3 | public class EBike extends Bike { 4 | 5 | public int maxSpeed; 6 | public int rearGearsCount; 7 | public int frontGearsCount; 8 | 9 | public EBike(String pn, double p, int ms, int rgc, int fgc, int bc) { 10 | productName = pn; 11 | price = p; 12 | maxSpeed = ms; 13 | rearGearsCount = rgc; 14 | frontGearsCount = fgc; 15 | batteryCapacity = bc; 16 | } 17 | 18 | public int getMaxSpeed() { 19 | return maxSpeed; 20 | } 21 | 22 | @Override 23 | public int getGearsCount() { 24 | return rearGearsCount * frontGearsCount; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lecture/quality/src/challenges/refactor/Mountainbike.java: -------------------------------------------------------------------------------- 1 | package challenges.refactor; 2 | 3 | public class Mountainbike extends Bike { 4 | 5 | public int maxSpeed; 6 | public int rearGearsCount; 7 | public int frontGearsCount; 8 | 9 | public Mountainbike(String pn, double p, int ms, int rgc, int fgc) { 10 | productName = pn; 11 | price = p; 12 | maxSpeed = ms; 13 | rearGearsCount = rgc; 14 | frontGearsCount = fgc; 15 | } 16 | 17 | public int getMaxSpeed() { 18 | return maxSpeed; 19 | } 20 | 21 | @Override 22 | public Integer getBatteryCapacity() { 23 | return null; 24 | } 25 | 26 | @Override 27 | public int getGearsCount() { 28 | return rearGearsCount * frontGearsCount; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lecture/quality/src/checkstyle/.gitattributes: -------------------------------------------------------------------------------- 1 | # 2 | # https://help.github.com/articles/dealing-with-line-endings/ 3 | # 4 | # These are explicitly windows files and should use crlf 5 | *.bat text eol=crlf 6 | 7 | -------------------------------------------------------------------------------- /lecture/quality/src/checkstyle/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | -------------------------------------------------------------------------------- /lecture/quality/src/checkstyle/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "java" 3 | id "application" 4 | id "checkstyle" 5 | } 6 | 7 | repositories { 8 | mavenCentral() 9 | } 10 | 11 | dependencies { 12 | } 13 | 14 | checkstyle { 15 | configFile file('checkstyle.xml') 16 | toolVersion '10.19.0' 17 | } 18 | 19 | application { 20 | mainClass = 'wuppie.deeplearning.strategy.MyWuppieStudi' 21 | } 22 | -------------------------------------------------------------------------------- /lecture/quality/src/checkstyle/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/src/checkstyle/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lecture/quality/src/checkstyle/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /lecture/quality/src/checkstyle/src/main/java/wuppie/deeplearning/strategy/MyWuppieStudi.java: -------------------------------------------------------------------------------- 1 | package wuppie.deeplearning.strategy; 2 | 3 | /** 4 | * Demonstriert den Einsatz von AOSP/Google Java Style ................. Umbruch nach 100 Zeichen | 5 | */ 6 | public class MyWuppieStudi implements Comparable { 7 | private static String lastName; 8 | private static MyWuppieStudi studi; 9 | 10 | private MyWuppieStudi() {} 11 | 12 | /** Erzeugt ein neues Exemplar der MyWuppieStudi-Spezies (max. 40 Zeilen) */ 13 | public static MyWuppieStudi getMyWuppieStudi(String name) { 14 | if (studi == null) { 15 | studi = new MyWuppieStudi(); 16 | } 17 | if (lastName == null) lastName = name; 18 | 19 | return studi; 20 | } 21 | 22 | @Override 23 | public int compareTo(MyWuppieStudi o) { 24 | return lastName.compareTo(lastName); 25 | } 26 | 27 | public static void main(String[] args) { 28 | MyWuppieStudi.getMyWuppieStudi("Hello World"); 29 | System.out.println("Hello World"); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lecture/quality/src/formatter/.gitattributes: -------------------------------------------------------------------------------- 1 | # 2 | # https://help.github.com/articles/dealing-with-line-endings/ 3 | # 4 | # These are explicitly windows files and should use crlf 5 | *.bat text eol=crlf 6 | 7 | -------------------------------------------------------------------------------- /lecture/quality/src/formatter/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | -------------------------------------------------------------------------------- /lecture/quality/src/formatter/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "java" 3 | id "application" 4 | id "com.diffplug.spotless" version "6.25.0" 5 | } 6 | 7 | repositories { 8 | mavenCentral() 9 | } 10 | 11 | dependencies { 12 | } 13 | 14 | spotless { 15 | java { 16 | // googleJavaFormat() 17 | googleJavaFormat().aosp() // indent w/ 4 spaces 18 | } 19 | } 20 | 21 | application { 22 | mainClass = 'wuppie.deeplearning.strategy.MyWuppieStudi' 23 | } 24 | -------------------------------------------------------------------------------- /lecture/quality/src/formatter/gradle.properties: -------------------------------------------------------------------------------- 1 | 2 | org.gradle.daemon=true 3 | org.gradle.configureondemand=false 4 | org.gradle.jvmargs=-Xms128m -Xmx2048m \ 5 | --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \ 6 | --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \ 7 | --add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \ 8 | --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \ 9 | --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED 10 | # The "add-exports" options are a workaround to use the "google-java-format" plugin with Java 17 and Gradle 7.2. 11 | # See also here: 12 | # https://github.com/google/google-java-format#jdk-16 13 | # https://github.com/diffplug/spotless/tree/main/plugin-gradle#google-java-format -------------------------------------------------------------------------------- /lecture/quality/src/formatter/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/src/formatter/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lecture/quality/src/formatter/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /lecture/quality/src/formatter/src/main/java/wuppie/deeplearning/strategy/MyWuppieStudi.java: -------------------------------------------------------------------------------- 1 | package wuppie.deeplearning.strategy; 2 | 3 | /** 4 | * Demonstriert den Einsatz von AOSP/Google Java Style ................. Umbruch nach 100 Zeichen | 5 | */ 6 | public class MyWuppieStudi implements Comparable { 7 | private static String lastName; 8 | private static MyWuppieStudi studi; 9 | 10 | private MyWuppieStudi() {} 11 | 12 | /** Erzeugt ein neues Exemplar der MyWuppieStudi-Spezies (max. 40 Zeilen) */ 13 | public static MyWuppieStudi getMyWuppieStudi(String name) { 14 | if (studi == null) { 15 | studi = new MyWuppieStudi(); 16 | } 17 | if (lastName == null) lastName = name; 18 | 19 | return studi; 20 | } 21 | 22 | @Override 23 | public int compareTo(MyWuppieStudi o) { 24 | return lastName.compareTo(lastName); 25 | } 26 | 27 | public static void main(String[] args) { 28 | MyWuppieStudi.getMyWuppieStudi("Hello World"); 29 | System.out.println("Hello World"); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lecture/quality/src/junit4/MyTestSuite4.java: -------------------------------------------------------------------------------- 1 | package junit4; 2 | 3 | import org.junit.runner.RunWith; 4 | import org.junit.runners.Suite; 5 | import org.junit.runners.Suite.SuiteClasses; 6 | 7 | /** 8 | * Beispiel-Testsuite mit JUnit 4 9 | */ 10 | 11 | @RunWith(Suite.class) 12 | @SuiteClasses({ 13 | // Hier kommen alle Testklassen rein 14 | Test4.class, 15 | SumTestConstructor.class 16 | }) 17 | 18 | public class MyTestSuite4 { 19 | // bleibt leer!!! 20 | } 21 | -------------------------------------------------------------------------------- /lecture/quality/src/junit4/Studi.java: -------------------------------------------------------------------------------- 1 | package junit4; 2 | 3 | public class Studi { 4 | private String name = ""; 5 | private int credits = 0; 6 | 7 | public String getName() { 8 | return name; 9 | } 10 | 11 | public void setName(String name) { 12 | if (name == null) { 13 | throw new IllegalArgumentException("Name darf nicht NULL sein"); 14 | } 15 | 16 | this.name = name; 17 | } 18 | 19 | public int getCredits() { 20 | return credits; 21 | } 22 | 23 | public void addToCredits(int credits) { 24 | if (credits < 0) { 25 | throw new IllegalArgumentException("Negative Credits nicht erlaubt"); 26 | } 27 | if (this.credits + credits > 210) { 28 | throw new IllegalArgumentException("Mehr als 210 Credits nicht erlaubt"); 29 | } 30 | 31 | this.credits += credits; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lecture/quality/src/junit4/Sum.java: -------------------------------------------------------------------------------- 1 | package junit4; 2 | 3 | public class Sum { 4 | public int sum(int i, int j) { 5 | return i + j; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lecture/quality/src/junit4/SumTestConstructor.java: -------------------------------------------------------------------------------- 1 | package junit4; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.junit.runners.Parameterized; 6 | import org.junit.runners.Parameterized.Parameters; 7 | 8 | import java.util.Arrays; 9 | import java.util.Collection; 10 | 11 | import static org.junit.Assert.assertEquals; 12 | 13 | /** 14 | * Beispiel-Test (parametrisiert, Variante Konstruktor) mit JUnit 4 15 | */ 16 | 17 | @RunWith(Parameterized.class) 18 | public class SumTestConstructor { 19 | 20 | private final int s1; 21 | private final int s2; 22 | private final int erg; 23 | 24 | public SumTestConstructor(int p1, int p2, int p3) { 25 | s1 = p1; 26 | s2 = p2; 27 | erg = p3; 28 | } 29 | 30 | @Parameters 31 | public static Collection values() { 32 | return Arrays.asList(new Object[][] { { 1, 1, 2 }, { 2, 2, 4 }, { 2, 2, 5 } }); 33 | } 34 | 35 | @Test 36 | public void testSum() { 37 | Sum s = new Sum(); 38 | assertEquals(s.sum(s1, s2), erg); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lecture/quality/src/junit4/SumTestParameters.java: -------------------------------------------------------------------------------- 1 | package junit4; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.junit.runners.Parameterized; 6 | import org.junit.runners.Parameterized.Parameter; 7 | import org.junit.runners.Parameterized.Parameters; 8 | 9 | import java.util.Arrays; 10 | import java.util.Collection; 11 | 12 | import static org.junit.Assert.assertEquals; 13 | 14 | /** 15 | * Beispiel-Test (parametrisiert, Variante @Parameter-Annotation) mit JUnit 4 16 | */ 17 | 18 | @RunWith(Parameterized.class) 19 | public class SumTestParameters { 20 | 21 | @Parameter(0) 22 | public int s1; 23 | 24 | @Parameter(1) 25 | public int s2; 26 | 27 | @Parameter(2) 28 | public int erg; 29 | 30 | @Parameters 31 | public static Collection values() { 32 | return Arrays.asList(new Object[][] { { 1, 1, 2 }, { 2, 2, 4 }, { 2, 2, 5 } }); 33 | } 34 | 35 | @Test 36 | public void testSum() { 37 | Sum s = new Sum(); 38 | assertEquals(s.sum(s1, s2), erg); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lecture/quality/src/junit4/Test4.java: -------------------------------------------------------------------------------- 1 | package junit4; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.assertEquals; 6 | 7 | /** 8 | * Beispiel-Test mit JUnit 4 9 | */ 10 | 11 | public class Test4 { 12 | @Test 13 | public void testSum() { 14 | Sum s = new Sum(); 15 | assertEquals(6, s.sum(2, 4)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lecture/quality/src/junit4/TestAssume.java: -------------------------------------------------------------------------------- 1 | package junit4; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.assertEquals; 6 | import static org.junit.Assume.assumeTrue; 7 | 8 | public class TestAssume { 9 | @Test 10 | public void testStudi() { 11 | Studi s = new Studi(); 12 | int cps = 2; 13 | // cps = -5; 14 | 15 | // assumeTrue(cps > 0); 16 | 17 | s.addToCredits(cps); 18 | assertEquals(cps, s.getCredits()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lecture/quality/src/junit5/Test5.java: -------------------------------------------------------------------------------- 1 | package junit5; 2 | 3 | import org.junit.jupiter.api.Tag; 4 | import org.junit.jupiter.api.Test; 5 | 6 | import static org.junit.jupiter.api.Assertions.assertEquals; 7 | 8 | /** 9 | * Beispiel-Test mit JUnit 5 10 | */ 11 | 12 | class Test5 { 13 | @Test 14 | @Tag("junit5") 15 | void testSum() { 16 | assertEquals(6, 2 + 4); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lecture/quality/src/junit5/TestMethodSource.java: -------------------------------------------------------------------------------- 1 | package junit5; 2 | 3 | import org.junit.jupiter.api.Tag; 4 | import org.junit.jupiter.params.ParameterizedTest; 5 | import org.junit.jupiter.params.provider.MethodSource; 6 | 7 | import static org.junit.jupiter.api.Assertions.assertEquals; 8 | 9 | /** 10 | * Beispiel-Test (parametrisiert, Variante @MethodSource) mit JUnit 5 11 | */ 12 | 13 | public class TestMethodSource { 14 | public static int[][] values() { 15 | return new int[][] { { 1, 1, 2 }, { 2, 2, 4 }, { 2, 2, 5 } }; 16 | } 17 | 18 | @ParameterizedTest 19 | @MethodSource("values") 20 | @Tag("junit5") 21 | void testSum(int[] data) { 22 | assertEquals(data[0] + data[1], data[2]); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lecture/quality/src/junit5/TestValueSource.java: -------------------------------------------------------------------------------- 1 | package junit5; 2 | 3 | import org.junit.jupiter.api.Tag; 4 | import org.junit.jupiter.params.ParameterizedTest; 5 | import org.junit.jupiter.params.provider.ValueSource; 6 | 7 | import static org.junit.jupiter.api.Assertions.assertTrue; 8 | 9 | /** 10 | * Beispiel-Test (parametrisiert, Variante @ValueSource) mit JUnit 5 11 | */ 12 | 13 | public class TestValueSource { 14 | @ParameterizedTest 15 | @ValueSource(strings = { "wuppie", "fluppie", "foo" }) 16 | @Tag("junit5") 17 | void testWuppie(String candidate) { 18 | assertTrue(candidate.equals("wuppie")); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lecture/quality/src/logging/LoggingDemo.java: -------------------------------------------------------------------------------- 1 | package logging; 2 | 3 | import java.util.logging.Level; 4 | import java.util.logging.Logger; 5 | 6 | public class LoggingDemo { 7 | private static final Logger log = Logger.getLogger(LoggingDemo.class.getName()); 8 | 9 | public static void main(String[] argv) { 10 | log.info("Und los ..."); 11 | 12 | try { 13 | log.log(Level.WARNING, "Vorsicht!"); 14 | int x = 0 / 0; 15 | } catch (Exception e) { 16 | log.log(Level.SEVERE, "Mift! Das ging schief: ", e); 17 | } 18 | 19 | log.info("Wuppie Fluppie :-))"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lecture/quality/src/logging/LoggingHandler.java: -------------------------------------------------------------------------------- 1 | package logging; 2 | 3 | import java.util.logging.ConsoleHandler; 4 | import java.util.logging.Level; 5 | import java.util.logging.Logger; 6 | 7 | public class LoggingHandler { 8 | private static final Logger log = Logger.getLogger(LoggingHandler.class.getName()); 9 | 10 | public static void main(String[] argv) { 11 | log.setUseParentHandlers(false); // ??? :-) 12 | 13 | // log.setLevel(Level.FINE); 14 | // log.setLevel(Level.ALL); 15 | 16 | ConsoleHandler handlerA = new ConsoleHandler(); 17 | handlerA.setLevel(Level.ALL); 18 | handlerA.setFormatter(new MyFormatter("A")); 19 | log.addHandler(handlerA); 20 | 21 | ConsoleHandler handlerB = new ConsoleHandler(); 22 | handlerB.setLevel(Level.FINER); 23 | handlerB.setFormatter(new MyFormatter("B")); 24 | log.addHandler(handlerB); 25 | 26 | log.finest("finest"); 27 | log.finer("finer"); 28 | log.fine("fine"); 29 | log.info("info"); 30 | log.warning("warning"); 31 | log.severe("severe"); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lecture/quality/src/logging/LoggingLevel.java: -------------------------------------------------------------------------------- 1 | package logging; 2 | 3 | import java.util.logging.Level; 4 | import java.util.logging.Logger; 5 | 6 | public class LoggingLevel { 7 | private static final Logger log = Logger.getLogger(LoggingLevel.class.getName()); 8 | 9 | public static void main(String[] argv) { 10 | // log.setLevel(Level.WARNING); 11 | // log.setLevel(Level.OFF); 12 | // log.setLevel(Level.ALL); // ??? :-) 13 | 14 | log.finest("level finest"); 15 | log.finer("level finer"); 16 | log.fine("level fine"); 17 | log.config("level config"); 18 | log.info("level info"); 19 | log.warning("level warning"); 20 | log.severe("level severe"); 21 | log.log(Level.INFO, "log() mit info-level"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lecture/quality/src/logging/MyFormatter.java: -------------------------------------------------------------------------------- 1 | package logging; 2 | 3 | import java.util.logging.LogRecord; 4 | import java.util.logging.SimpleFormatter; 5 | 6 | class MyFormatter extends SimpleFormatter { 7 | private final String name; 8 | 9 | public MyFormatter(String n) { 10 | name = n; 11 | } 12 | 13 | @Override 14 | public String format(LogRecord record) { 15 | return "---- " + name + " ::" + record.getMessage() + ":: " + name + " ----\n"; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/.gitattributes: -------------------------------------------------------------------------------- 1 | # 2 | # https://help.github.com/articles/dealing-with-line-endings/ 3 | # 4 | # These are explicitly windows files and should use crlf 5 | *.bat text eol=crlf 6 | 7 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "java" 3 | id "checkstyle" 4 | id "com.diffplug.spotless" version "6.25.0" 5 | id "com.github.spotbugs" version "6.0.15" 6 | } 7 | 8 | repositories { 9 | mavenCentral() 10 | } 11 | 12 | dependencies { 13 | testImplementation 'junit:junit:4.13.2' 14 | testImplementation 'org.mockito:mockito-core:5.12.0' 15 | } 16 | 17 | checkstyle { 18 | configFile file('checkstyle.xml') 19 | toolVersion '10.19.0' 20 | } 21 | 22 | spotless { 23 | java { 24 | googleJavaFormat().aosp() 25 | } 26 | } 27 | 28 | spotbugs { 29 | ignoreFailures = true 30 | showStackTraces = false 31 | toolVersion = '4.8.5' 32 | } 33 | spotbugsMain { 34 | reports { 35 | html { 36 | required = true 37 | outputLocation = file("$buildDir/reports/spotbugs/spotbugs.html") 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/gradle.properties: -------------------------------------------------------------------------------- 1 | 2 | org.gradle.daemon=true 3 | org.gradle.configureondemand=false 4 | org.gradle.jvmargs=-Xms128m -Xmx2048m \ 5 | --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \ 6 | --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \ 7 | --add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \ 8 | --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \ 9 | --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED 10 | # The "add-exports" options are a workaround to use the "google-java-format" plugin with Java 17 and Gradle 7.2. 11 | # See also here: 12 | # https://github.com/google/google-java-format#jdk-16 13 | # https://github.com/diffplug/spotless/tree/main/plugin-gradle#google-java-format 14 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/src/mockito/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lecture/quality/src/mockito/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/main/java/hsbi/LSF.java: -------------------------------------------------------------------------------- 1 | package hsbi; 2 | 3 | public class LSF { 4 | /** 5 | * Melde einen Studi in einem Modul zur Prüfung an. 6 | * 7 | * @param name Name des anzumeldenden Studis 8 | * @param modul Modul, in dem der Studi angemeldet wird 9 | * @return true, wenn die Anmeldung erfolgreich war; sonst false 10 | */ 11 | public boolean anmelden(String name, String modul) { 12 | throw new UnsupportedOperationException(); 13 | } 14 | 15 | /** 16 | * Finde die Punkte heraus, die ein Studi in einer Modulprüfung erreicht hat 17 | * 18 | *

Um den Profs das Leben leichter zu machen, werden die Prüfungen automatisch mit einer 19 | * zufälligen Zahl von Punkten zwischen 0 und 100 bewertet. 20 | * 21 | * @param name Name des Studis 22 | * @param modul Modul, für das die Ergebnisse abgefragt werden 23 | * @return Anzahl der Punkte: [0,100] 24 | */ 25 | public int ergebnis(String name, String modul) { 26 | throw new UnsupportedOperationException(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/main/java/hsbi/Studi.java: -------------------------------------------------------------------------------- 1 | package hsbi; 2 | 3 | public class Studi { 4 | String name; 5 | LSF lsf; 6 | 7 | public Studi(String name, LSF lsf) { 8 | this.name = name; 9 | this.lsf = lsf; 10 | } 11 | 12 | /** 13 | * Melde den Studi zur Prüfung an. 14 | * 15 | * @param modul In diesem Modul will sich der Studi anmelden 16 | * @return true, wenn Anmeldung erfolgreich; sonst false 17 | */ 18 | public boolean anmelden(String modul) { 19 | return lsf.anmelden(name, modul); 20 | } 21 | 22 | /** 23 | * Nehme an der Klausureinsicht teil und reagiere auf das Ergebnis. 24 | * 25 | * @param modul Für dieses Modul soll die Einsicht erfolgen 26 | * @return true, falls mehr als 50 Punkte (bestanden); sonst false 27 | */ 28 | public boolean einsicht(String modul) { 29 | return lsf.ergebnis(name, modul) > 50; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/main/java/wuppie/mock/IWuppiWarenlager.java: -------------------------------------------------------------------------------- 1 | package wuppie.mock; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Das Warenlager für die Wuppis gibt es noch gar nicht, es befindet sich derzeit aber bereits im 7 | * Bau. Später sollen darüber alle Wuppis bestellt werden können. 8 | */ 9 | public interface IWuppiWarenlager { 10 | /** 11 | * Gibt alle im Warenlager befindlichen Wuppis als Liste zurück. 12 | * 13 | * @return Eine Liste mit Wuppis des Warenlagers. 14 | */ 15 | List getAlleWuppis(); 16 | } 17 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/main/java/wuppie/mock/WuppiStore.java: -------------------------------------------------------------------------------- 1 | package wuppie.mock; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Über unsere brandheißen WuppiStores verkaufen wir dann alle Wuppis aus dem Wuppi-Warenlager (wenn 7 | * es mal fertiggestellt ist). 8 | */ 9 | public class WuppiStore { 10 | public IWuppiWarenlager lager; 11 | 12 | public WuppiStore(IWuppiWarenlager lager) { 13 | this.lager = lager; 14 | } 15 | 16 | /** 17 | * Bestellt alle Wuppis aus dem angegebenen Warenlager 18 | * 19 | * @param lager Das Lager, aus dem die Wuppis geordert werden. 20 | * @return Eine Liste mit allen Wuppis, die bestellt wurden. 21 | */ 22 | public List bestelleAlleWuppis(IWuppiWarenlager lager) { 23 | return lager.getAlleWuppis(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/main/java/wuppie/spy/IWuppiWarenlager.java: -------------------------------------------------------------------------------- 1 | package wuppie.spy; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Das Warenlager für die Wuppis gibt es noch gar nicht, es befindet sich derzeit aber bereits im 7 | * Bau. Später sollen darüber alle Wuppis bestellt werden können. 8 | */ 9 | public interface IWuppiWarenlager { 10 | /** 11 | * Gibt alle im Warenlager befindlichen Wuppis als Liste zurück. 12 | * 13 | * @return Eine Liste mit Wuppis des Warenlagers. 14 | */ 15 | List getAlleWuppis(); 16 | 17 | /** 18 | * Fügt dem Warenlager den übergebenen Wuppi hinzu. 19 | * 20 | * @param wuppi Der Wuppi der dem Lager hinzugefügt werden soll. 21 | */ 22 | void addWuppi(Wuppi wuppi); 23 | } 24 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/main/java/wuppie/spy/Wuppi.java: -------------------------------------------------------------------------------- 1 | package wuppie.spy; 2 | 3 | /** Ein einfacher Wuppi */ 4 | public class Wuppi { 5 | String name; 6 | 7 | /** 8 | * Erzeugt einen neuen Wuppi mit dem übergebenen Namen. 9 | * 10 | * @param name Der Name des Wuppis 11 | */ 12 | Wuppi(String name) { 13 | this.name = name; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/main/java/wuppie/spy/WuppiStore.java: -------------------------------------------------------------------------------- 1 | package wuppie.spy; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Über unsere brandheißen WuppiStores verkaufen wir dann alle Wuppis aus dem Wuppi-Warenlager (wenn 7 | * es mal fertiggestellt ist). 8 | */ 9 | public class WuppiStore { 10 | public IWuppiWarenlager lager; 11 | 12 | public WuppiStore(IWuppiWarenlager lager) { 13 | this.lager = lager; 14 | } 15 | 16 | /** 17 | * Bestellt alle Wuppis aus dem angegebenen Warenlager 18 | * 19 | * @param lager Das lager aus dem die Wuppis geordert werden. 20 | * @return Eine Liste mit allen Wuppis die bestellt wurden. 21 | */ 22 | public List bestelleAlleWuppis(IWuppiWarenlager lager) { 23 | return lager.getAlleWuppis(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/main/java/wuppie/spy/WuppiWarenlager.java: -------------------------------------------------------------------------------- 1 | package wuppie.spy; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class WuppiWarenlager implements IWuppiWarenlager { 7 | List lager = new ArrayList<>(); 8 | 9 | /** @inheritDoc */ 10 | @Override 11 | public List getAlleWuppis() { 12 | return this.lager; 13 | } 14 | 15 | /** @inheritDoc */ 16 | @Override 17 | public void addWuppi(Wuppi wuppi) { 18 | this.lager.add(wuppi); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/main/java/wuppie/stub/IWuppiWarenlager.java: -------------------------------------------------------------------------------- 1 | package wuppie.stub; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Das Warenlager für die Wuppis gibt es noch gar nicht, es befindet sich derzeit aber bereits im 7 | * Bau. Später sollen darüber alle Wuppis bestellt werden können. 8 | */ 9 | public interface IWuppiWarenlager { 10 | /** 11 | * Gibt alle im Warenlager befindlichen Wuppis als Liste zurück. 12 | * 13 | * @return Eine Liste mit Wuppis des Warenlagers. 14 | */ 15 | List getAlleWuppis(); 16 | } 17 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/main/java/wuppie/stub/WuppiStore.java: -------------------------------------------------------------------------------- 1 | package wuppie.stub; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Über unsere brandheißen WuppiStores verkaufen wir dann alle Wuppis aus dem Wuppi-Warenlager (wenn 7 | * es mal fertiggestellt ist). 8 | */ 9 | public class WuppiStore { 10 | public IWuppiWarenlager lager; 11 | 12 | public WuppiStore(IWuppiWarenlager lager) { 13 | this.lager = lager; 14 | } 15 | 16 | /** 17 | * Bestellt alle Wuppis aus dem angegebenen Warenlager 18 | * 19 | * @param lager Das Lager, aus dem die Wuppis geordert werden. 20 | * @return Eine Liste mit allen Wuppis, die bestellt wurden. 21 | */ 22 | public List bestelleAlleWuppis(IWuppiWarenlager lager) { 23 | return lager.getAlleWuppis(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/main/java/wuppie/stub/WuppiWarenlagerStub.java: -------------------------------------------------------------------------------- 1 | package wuppie.stub; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | 6 | /** 7 | * Da es noch kein funktionierendes Lager mit Wuppis gibt, wir aber trotzdem schon einmal unser 8 | * Kassensystem erstellen wollen, mit denen dann alle Wuppis bestellt werden können, erzeugen wir 9 | * uns einfach einen Stub des später einmal existierenden Warenlagers, um die Funktionalität des 10 | * Lagers testen zu können. 11 | */ 12 | public class WuppiWarenlagerStub implements IWuppiWarenlager { 13 | /** @inheritDoc */ 14 | public List getAlleWuppis() { 15 | return Arrays.asList("GruenerWuppi", "RoterWuppi"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/main/java/wuppie/verify/FluppisListe.java: -------------------------------------------------------------------------------- 1 | package wuppie.verify; 2 | 3 | import java.util.AbstractList; 4 | 5 | public class FluppisListe extends AbstractList { 6 | @Override 7 | public String get(int index) { 8 | return null; 9 | } 10 | 11 | @Override 12 | public int size() { 13 | return 0; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/test/java/hsbi/StudiStubTest.java: -------------------------------------------------------------------------------- 1 | package hsbi; 2 | 3 | import org.junit.Before; 4 | import org.junit.Test; 5 | 6 | import static org.junit.Assert.assertTrue; 7 | 8 | public class StudiStubTest { 9 | Studi studi; 10 | LSF lsf; 11 | 12 | @Before 13 | public void setUp() { 14 | lsf = new LsfStub(); 15 | studi = new Studi("Harald", lsf); 16 | } 17 | 18 | @Test 19 | public void testAnmelden() { 20 | assertTrue(studi.anmelden("PM-Dungeon")); 21 | } 22 | 23 | @Test 24 | public void testEinsicht() { 25 | assertTrue(studi.einsicht("PM-Dungeon")); 26 | } 27 | 28 | // Stub für das noch nicht fertige LSF 29 | class LsfStub extends LSF { 30 | public boolean anmelden(String name, String modul) { 31 | return true; 32 | } 33 | 34 | public int ergebnis(String name, String modul) { 35 | return 80; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /lecture/quality/src/mockito/src/test/java/hsbi/VerifyTest.java: -------------------------------------------------------------------------------- 1 | package hsbi; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.assertTrue; 6 | import static org.mockito.Mockito.*; 7 | 8 | public class VerifyTest { 9 | @Test 10 | public void testAnmelden() { 11 | LSF lsf = mock(LSF.class); 12 | Studi studi = new Studi("Harald", lsf); 13 | 14 | when(lsf.anmelden("Harald", "PM-Dungeon")).thenReturn(true); 15 | 16 | assertTrue(studi.anmelden("PM-Dungeon")); 17 | 18 | verify(lsf).anmelden("Harald", "PM-Dungeon"); 19 | 20 | verify(lsf, times(1)).anmelden("Harald", "PM-Dungeon"); 21 | verify(lsf, atLeast(1)).anmelden("Harald", "PM-Dungeon"); 22 | verify(lsf, atMost(1)).anmelden("Harald", "PM-Dungeon"); 23 | 24 | verify(lsf, never()).ergebnis("Harald", "PM-Dungeon"); 25 | 26 | verifyNoMoreInteractions(lsf); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lecture/quality/src/refactoring/Kurs.java: -------------------------------------------------------------------------------- 1 | package refactoring; 2 | 3 | public class Kurs { 4 | public int cps; 5 | public String descr; 6 | 7 | public Kurs(String descr, int cps) { 8 | this.descr = descr; 9 | this.cps = cps; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lecture/quality/src/refactoring/KursTest.java: -------------------------------------------------------------------------------- 1 | package refactoring; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.assertEquals; 6 | 7 | public class KursTest { 8 | @Test 9 | public void testKurs() { 10 | Kurs k = new Kurs("Test", 42); 11 | 12 | assertEquals("Test", k.descr); 13 | assertEquals(42, k.cps); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lecture/quality/src/refactoring/Person.java: -------------------------------------------------------------------------------- 1 | package refactoring; 2 | 3 | public class Person { 4 | } 5 | -------------------------------------------------------------------------------- /lecture/quality/src/refactoring/PersonTest.java: -------------------------------------------------------------------------------- 1 | package refactoring; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.assertNotNull; 6 | import static org.junit.Assume.assumeTrue; 7 | 8 | public class PersonTest { 9 | @Test 10 | public void testPerson() { 11 | Person p = new Person(); 12 | 13 | assertNotNull(p); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lecture/quality/src/refactoring/StudiTest.java: -------------------------------------------------------------------------------- 1 | package refactoring; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.assertEquals; 6 | 7 | public class StudiTest { 8 | @Test 9 | public void testStudi() { 10 | Kurs k = new Kurs("myKurs", 9); 11 | Studi s = new Studi("Werner", 3, k); 12 | 13 | assertEquals("Werner", s.n); 14 | assertEquals(3, s.c); 15 | assertEquals(k, s.k); 16 | } 17 | 18 | @Test 19 | public void testChangeNme() { 20 | Kurs k = new Kurs("myKurs", 9); 21 | Studi s = new Studi("Werner", 3, k); 22 | 23 | assertEquals("Werner", s.n); 24 | 25 | s.n = "Heini"; 26 | assertEquals("Heini", s.n); 27 | assertEquals(3, s.c); 28 | assertEquals(k, s.k); 29 | } 30 | 31 | @Test 32 | public void testPrtIf() { 33 | Kurs k = new Kurs("myKurs", 9); 34 | Studi s = new Studi("Werner", 3, k); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lecture/quality/src/spotbugs/.gitattributes: -------------------------------------------------------------------------------- 1 | # 2 | # https://help.github.com/articles/dealing-with-line-endings/ 3 | # 4 | # These are explicitly windows files and should use crlf 5 | *.bat text eol=crlf 6 | 7 | -------------------------------------------------------------------------------- /lecture/quality/src/spotbugs/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | -------------------------------------------------------------------------------- /lecture/quality/src/spotbugs/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "java" 3 | id "application" 4 | id "com.github.spotbugs" version "6.0.15" 5 | } 6 | 7 | repositories { 8 | mavenCentral() 9 | } 10 | 11 | dependencies { 12 | } 13 | 14 | spotbugs { 15 | ignoreFailures = true 16 | showStackTraces = false 17 | toolVersion = '4.8.5' 18 | } 19 | spotbugsMain { 20 | reports { 21 | html { 22 | required = true 23 | outputLocation = file("$buildDir/reports/spotbugs/spotbugs.html") 24 | } 25 | } 26 | } 27 | 28 | application { 29 | mainClass = 'wuppie.deeplearning.strategy.MyWuppieStudi' 30 | } 31 | -------------------------------------------------------------------------------- /lecture/quality/src/spotbugs/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Programmiermethoden-CampusMinden/Prog2-Lecture/bba3ae3786a25142d0d1b553996547cd2f02edfe/lecture/quality/src/spotbugs/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /lecture/quality/src/spotbugs/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /lecture/quality/src/spotbugs/src/main/java/wuppie/deeplearning/strategy/MyWuppieStudi.java: -------------------------------------------------------------------------------- 1 | package wuppie.deeplearning.strategy; 2 | 3 | /** 4 | * Demonstriert den Einsatz von AOSP/Google Java Style ................. Umbruch nach 100 Zeichen | 5 | */ 6 | public class MyWuppieStudi implements Comparable { 7 | private static String lastName; 8 | private static MyWuppieStudi studi; 9 | 10 | private MyWuppieStudi() {} 11 | 12 | /** Erzeugt ein neues Exemplar der MyWuppieStudi-Spezies (max. 40 Zeilen) */ 13 | public static MyWuppieStudi getMyWuppieStudi(String name) { 14 | if (studi == null) { 15 | new MyWuppieStudi(); 16 | } 17 | if (lastName == name || true) lastName = name; 18 | 19 | return studi; 20 | } 21 | 22 | @Override 23 | public int compareTo(MyWuppieStudi o) { 24 | return lastName.compareTo(lastName); 25 | } 26 | 27 | public static void main(String[] args) { 28 | MyWuppieStudi.getMyWuppieStudi("Hello World"); 29 | System.out.println("Hello World"); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lecture/quality/src/tdd/PasswordChecker.java: -------------------------------------------------------------------------------- 1 | package tdd; 2 | 3 | public class PasswordChecker { 4 | public static boolean isValid(String pw) { 5 | if (pw == null) { 6 | return false; 7 | } 8 | return !pw.isEmpty() && pw.length() > 3 && pw.length() <= 10; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lecture/quality/src/tdd/anforderungen.md: -------------------------------------------------------------------------------- 1 | # Passwort-Prüfer 2 | 3 | + Passwort ist ein String 4 | + Passwort darf nicht leer sein 5 | + Passwort muss länger als 4 Zeichen sein 6 | + Passwort darf nicht länger als 10 Zeichen sein 7 | -------------------------------------------------------------------------------- /lecture/readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Vorlesungsunterlagen" 3 | no_pdf: true 4 | no_beamer: true 5 | --- 6 | -------------------------------------------------------------------------------- /pm.yaml: -------------------------------------------------------------------------------- 1 | # language 2 | lang: de-DE 3 | 4 | # author information 5 | institute: "Unless otherwise noted, this work is licensed under CC BY-SA 4.0." 6 | 7 | # bibtex file 8 | bibliography: pm.bib 9 | 10 | # collect references (for use in filter/template) 11 | refs: | 12 | ::: {#refs} 13 | ::: 14 | 15 | # root document 16 | root_doc: readme.md 17 | indexMD: readme 18 | 19 | # license footer 20 | license_footer: | 21 | ![](https://licensebuttons.net/l/by-sa/4.0/88x31.png){width="10%"} 22 | 23 | Unless otherwise noted, this work is licensed under CC BY-SA 4.0. 24 | --------------------------------------------------------------------------------