From 16368c9c8b44d47c94055603965883493a65ac9b Mon Sep 17 00:00:00 2001 From: JunkJumper Date: Fri, 1 May 2020 22:28:41 +0200 Subject: [PATCH] "depot M315" --- .classpath | 10 + .project | 17 + .settings/org.eclipse.jdt.core.prefs | 12 + bin/forum/Administrateur.class | Bin 0 -> 447 bytes bin/forum/Canal.class | Bin 0 -> 535 bytes bin/forum/CanalDeBreve.class | Bin 0 -> 463 bytes bin/forum/CanalParDefaut.class | Bin 0 -> 352 bytes bin/forum/Controleur.class | Bin 0 -> 3214 bytes bin/forum/Forum.class | Bin 0 -> 575 bytes bin/forum/GestionnaireCanal.class | Bin 0 -> 1260 bytes bin/forum/GestionnaireForum.class | Bin 0 -> 1345 bytes bin/forum/Memoire.class | Bin 0 -> 2651 bytes bin/forum/Message.class | Bin 0 -> 297 bytes bin/forum/Producteur.class | Bin 0 -> 464 bytes bin/forum/UserConsole.class | Bin 0 -> 3565 bytes .../core/AlreadyBooked.class | Bin 0 -> 447 bytes .../core/AucunItemCorrespondant.class | Bin 0 -> 474 bytes bin/openClosedPrinciples/core/Car.class | Bin 0 -> 1115 bytes bin/openClosedPrinciples/core/CarRental.class | Bin 0 -> 2613 bytes .../core/CarRentalService.class | Bin 0 -> 4586 bytes .../core/CarRentalServiceTest.class | Bin 0 -> 3172 bytes .../core/CarRentalTest.class | Bin 0 -> 2213 bytes bin/openClosedPrinciples/core/DateTools.class | Bin 0 -> 949 bytes .../core/Description.class | Bin 0 -> 1494 bytes bin/openClosedPrinciples/core/Flight.class | Bin 0 -> 2904 bytes .../core/FlightService.class | Bin 0 -> 4549 bytes .../core/FlightServiceTest.class | Bin 0 -> 2212 bytes .../core/FlightTest.class | Bin 0 -> 1264 bytes .../core/GestionnaireVoyages.class | Bin 0 -> 5212 bytes .../core/NotPossibleCarRentalException.class | Bin 0 -> 495 bytes .../core/PayingItem.class | Bin 0 -> 681 bytes bin/openClosedPrinciples/core/Service.class | Bin 0 -> 2525 bytes .../core/TravelOrganizer.class | Bin 0 -> 5056 bytes bin/openClosedPrinciples/core/Trip.class | Bin 0 -> 1532 bytes bin/td5/p1/Launch.class | Bin 0 -> 946 bytes bin/td5/p1/ModernWeaponFactory.class | Bin 0 -> 1312 bytes bin/td5/p1/WeaponFactory.class | Bin 0 -> 2206 bytes bin/td5/p1/arme/Arme.class | Bin 0 -> 1677 bytes bin/td5/p1/arme/Bouclier.class | Bin 0 -> 457 bytes bin/td5/p1/arme/Dague.class | Bin 0 -> 446 bytes bin/td5/p1/arme/Epée.class | Bin 0 -> 445 bytes bin/td5/p1/arme/Fusil.class | Bin 0 -> 445 bytes bin/td5/p1/etat/Faible.class | Bin 0 -> 1497 bytes bin/td5/p1/etat/Mort.class | Bin 0 -> 426 bytes bin/td5/p1/etat/PlayerState.class | Bin 0 -> 1160 bytes bin/td5/p1/etat/Vivant.class | Bin 0 -> 1470 bytes bin/td5/p1/personnage/Humain.class | Bin 0 -> 818 bytes bin/td5/p1/personnage/Orc.class | Bin 0 -> 783 bytes bin/td5/p1/personnage/Personnage.class | Bin 0 -> 2069 bytes bin/td5/p1/personnage/Tauren.class | Bin 0 -> 798 bytes bin/td5/p1/personnage/Troll.class | Bin 0 -> 830 bytes bin/td5/p1/td5p1.png | Bin 0 -> 88597 bytes bin/td5/p1/testArmes.class | Bin 0 -> 2772 bytes src/Diagramme_de_classe_forum.ucls | 147 +++ src/designPattern/facebookGhost/Event.java | 5 + .../facebookGhost/FacebookGhostNetwork.java | 125 +++ .../facebookGhost/IdNameEntity.java | 6 + .../facebookGhost/IdNameEntityImpl.java | 25 + .../facebookGhost/RelationEvent.java | 32 + src/designPattern/facebookGhost/User.java | 104 +++ .../facebookGhost/UserEvent.java | 11 + src/designPattern/facebookGhost/UserImpl.java | 105 +++ src/designPattern/grapheSimple/Chemin.java | 192 ++++ .../grapheSimple/GrapheSimple.java | 260 ++++++ src/designPattern/grapheX/Arc.java | 83 ++ src/designPattern/grapheX/Graphe.java | 871 ++++++++++++++++++ .../grapheX/GrapheGenerique.java | 81 ++ src/designPattern/grapheX/Identifiable.java | 100 ++ src/designPattern/grapheX/Sommet.java | 23 + src/designPattern/grapheX/SommetValue.java | 11 + .../reseauSocial/core/Member.java | 44 + .../reseauSocial/core/MemberInterface.java | 10 + .../reseauSocial/core/SocialNetWorkImpl.java | 85 ++ .../core/SocialNetworkInterface.java | 74 ++ .../reseauSocial/core/Strength.java | 17 + src/forum/Administrateur.java | 15 + src/forum/Canal.java | 17 + src/forum/CanalDeBreve.java | 14 + src/forum/CanalParDefaut.java | 9 + src/forum/Controleur.java | 88 ++ src/forum/Forum.java | 17 + src/forum/GestionnaireCanal.java | 26 + src/forum/GestionnaireForum.java | 29 + src/forum/Memoire.java | 52 ++ src/forum/Message.java | 7 + src/forum/Producteur.java | 15 + src/forum/UserConsole.java | 80 ++ .../core/AlreadyBooked.java | 18 + .../core/AucunItemCorrespondant.java | 14 + src/openClosedPrinciples/core/Car.java | 50 + src/openClosedPrinciples/core/CarRental.java | 77 ++ .../core/CarRentalService.java | 77 ++ src/openClosedPrinciples/core/DateTools.java | 37 + .../core/Description.java | 68 ++ src/openClosedPrinciples/core/Flight.java | 92 ++ .../core/FlightService.java | 50 + .../core/GestionnaireVoyages.java | 112 +++ .../core/NotPossibleCarRentalException.java | 19 + src/openClosedPrinciples/core/PayingItem.java | 30 + src/openClosedPrinciples/core/Service.java | 46 + .../core/TravelOrganizer.java | 99 ++ src/openClosedPrinciples/core/Trip.java | 49 + src/td5/p1/Launch.java | 26 + src/td5/p1/ModernWeaponFactory.java | 37 + src/td5/p1/WeaponFactory.java | 74 ++ src/td5/p1/arme/Arme.java | 74 ++ src/td5/p1/arme/Bouclier.java | 14 + src/td5/p1/arme/Dague.java | 13 + src/td5/p1/arme/Epée.java | 13 + src/td5/p1/arme/Fusil.java | 14 + src/td5/p1/etat/Faible.java | 24 + src/td5/p1/etat/Mort.java | 17 + src/td5/p1/etat/PlayerState.java | 41 + src/td5/p1/etat/Vivant.java | 24 + src/td5/p1/personnage/Humain.java | 27 + src/td5/p1/personnage/Orc.java | 27 + src/td5/p1/personnage/Personnage.java | 86 ++ src/td5/p1/personnage/Tauren.java | 26 + src/td5/p1/personnage/Troll.java | 26 + src/td5/p1/td5p1.png | Bin 0 -> 88597 bytes .../core/CarRentalServiceTest.java | 87 ++ .../core/CarRentalTest.java | 61 ++ .../core/FlightServiceTest.java | 47 + .../openClosedPrinciples/core/FlightTest.java | 30 + tests/td5/p1/testArmes.java | 61 ++ 125 files changed, 4506 insertions(+) create mode 100755 .classpath create mode 100755 .project create mode 100755 .settings/org.eclipse.jdt.core.prefs create mode 100755 bin/forum/Administrateur.class create mode 100755 bin/forum/Canal.class create mode 100755 bin/forum/CanalDeBreve.class create mode 100755 bin/forum/CanalParDefaut.class create mode 100755 bin/forum/Controleur.class create mode 100755 bin/forum/Forum.class create mode 100755 bin/forum/GestionnaireCanal.class create mode 100755 bin/forum/GestionnaireForum.class create mode 100755 bin/forum/Memoire.class create mode 100755 bin/forum/Message.class create mode 100755 bin/forum/Producteur.class create mode 100755 bin/forum/UserConsole.class create mode 100644 bin/openClosedPrinciples/core/AlreadyBooked.class create mode 100644 bin/openClosedPrinciples/core/AucunItemCorrespondant.class create mode 100644 bin/openClosedPrinciples/core/Car.class create mode 100644 bin/openClosedPrinciples/core/CarRental.class create mode 100644 bin/openClosedPrinciples/core/CarRentalService.class create mode 100644 bin/openClosedPrinciples/core/CarRentalServiceTest.class create mode 100644 bin/openClosedPrinciples/core/CarRentalTest.class create mode 100644 bin/openClosedPrinciples/core/DateTools.class create mode 100644 bin/openClosedPrinciples/core/Description.class create mode 100644 bin/openClosedPrinciples/core/Flight.class create mode 100644 bin/openClosedPrinciples/core/FlightService.class create mode 100644 bin/openClosedPrinciples/core/FlightServiceTest.class create mode 100644 bin/openClosedPrinciples/core/FlightTest.class create mode 100644 bin/openClosedPrinciples/core/GestionnaireVoyages.class create mode 100644 bin/openClosedPrinciples/core/NotPossibleCarRentalException.class create mode 100644 bin/openClosedPrinciples/core/PayingItem.class create mode 100644 bin/openClosedPrinciples/core/Service.class create mode 100644 bin/openClosedPrinciples/core/TravelOrganizer.class create mode 100644 bin/openClosedPrinciples/core/Trip.class create mode 100644 bin/td5/p1/Launch.class create mode 100644 bin/td5/p1/ModernWeaponFactory.class create mode 100644 bin/td5/p1/WeaponFactory.class create mode 100644 bin/td5/p1/arme/Arme.class create mode 100644 bin/td5/p1/arme/Bouclier.class create mode 100644 bin/td5/p1/arme/Dague.class create mode 100644 bin/td5/p1/arme/Epée.class create mode 100644 bin/td5/p1/arme/Fusil.class create mode 100644 bin/td5/p1/etat/Faible.class create mode 100644 bin/td5/p1/etat/Mort.class create mode 100644 bin/td5/p1/etat/PlayerState.class create mode 100644 bin/td5/p1/etat/Vivant.class create mode 100644 bin/td5/p1/personnage/Humain.class create mode 100644 bin/td5/p1/personnage/Orc.class create mode 100644 bin/td5/p1/personnage/Personnage.class create mode 100644 bin/td5/p1/personnage/Tauren.class create mode 100644 bin/td5/p1/personnage/Troll.class create mode 100644 bin/td5/p1/td5p1.png create mode 100644 bin/td5/p1/testArmes.class create mode 100755 src/Diagramme_de_classe_forum.ucls create mode 100644 src/designPattern/facebookGhost/Event.java create mode 100644 src/designPattern/facebookGhost/FacebookGhostNetwork.java create mode 100644 src/designPattern/facebookGhost/IdNameEntity.java create mode 100644 src/designPattern/facebookGhost/IdNameEntityImpl.java create mode 100644 src/designPattern/facebookGhost/RelationEvent.java create mode 100644 src/designPattern/facebookGhost/User.java create mode 100644 src/designPattern/facebookGhost/UserEvent.java create mode 100644 src/designPattern/facebookGhost/UserImpl.java create mode 100644 src/designPattern/grapheSimple/Chemin.java create mode 100644 src/designPattern/grapheSimple/GrapheSimple.java create mode 100644 src/designPattern/grapheX/Arc.java create mode 100644 src/designPattern/grapheX/Graphe.java create mode 100644 src/designPattern/grapheX/GrapheGenerique.java create mode 100644 src/designPattern/grapheX/Identifiable.java create mode 100644 src/designPattern/grapheX/Sommet.java create mode 100644 src/designPattern/grapheX/SommetValue.java create mode 100644 src/designPattern/reseauSocial/core/Member.java create mode 100755 src/designPattern/reseauSocial/core/MemberInterface.java create mode 100644 src/designPattern/reseauSocial/core/SocialNetWorkImpl.java create mode 100755 src/designPattern/reseauSocial/core/SocialNetworkInterface.java create mode 100755 src/designPattern/reseauSocial/core/Strength.java create mode 100755 src/forum/Administrateur.java create mode 100755 src/forum/Canal.java create mode 100755 src/forum/CanalDeBreve.java create mode 100755 src/forum/CanalParDefaut.java create mode 100755 src/forum/Controleur.java create mode 100755 src/forum/Forum.java create mode 100755 src/forum/GestionnaireCanal.java create mode 100755 src/forum/GestionnaireForum.java create mode 100755 src/forum/Memoire.java create mode 100755 src/forum/Message.java create mode 100755 src/forum/Producteur.java create mode 100755 src/forum/UserConsole.java create mode 100644 src/openClosedPrinciples/core/AlreadyBooked.java create mode 100644 src/openClosedPrinciples/core/AucunItemCorrespondant.java create mode 100644 src/openClosedPrinciples/core/Car.java create mode 100644 src/openClosedPrinciples/core/CarRental.java create mode 100644 src/openClosedPrinciples/core/CarRentalService.java create mode 100644 src/openClosedPrinciples/core/DateTools.java create mode 100644 src/openClosedPrinciples/core/Description.java create mode 100644 src/openClosedPrinciples/core/Flight.java create mode 100644 src/openClosedPrinciples/core/FlightService.java create mode 100644 src/openClosedPrinciples/core/GestionnaireVoyages.java create mode 100644 src/openClosedPrinciples/core/NotPossibleCarRentalException.java create mode 100644 src/openClosedPrinciples/core/PayingItem.java create mode 100644 src/openClosedPrinciples/core/Service.java create mode 100644 src/openClosedPrinciples/core/TravelOrganizer.java create mode 100644 src/openClosedPrinciples/core/Trip.java create mode 100644 src/td5/p1/Launch.java create mode 100644 src/td5/p1/ModernWeaponFactory.java create mode 100644 src/td5/p1/WeaponFactory.java create mode 100644 src/td5/p1/arme/Arme.java create mode 100644 src/td5/p1/arme/Bouclier.java create mode 100644 src/td5/p1/arme/Dague.java create mode 100644 src/td5/p1/arme/Epée.java create mode 100644 src/td5/p1/arme/Fusil.java create mode 100644 src/td5/p1/etat/Faible.java create mode 100644 src/td5/p1/etat/Mort.java create mode 100644 src/td5/p1/etat/PlayerState.java create mode 100644 src/td5/p1/etat/Vivant.java create mode 100644 src/td5/p1/personnage/Humain.java create mode 100644 src/td5/p1/personnage/Orc.java create mode 100644 src/td5/p1/personnage/Personnage.java create mode 100644 src/td5/p1/personnage/Tauren.java create mode 100644 src/td5/p1/personnage/Troll.java create mode 100644 src/td5/p1/td5p1.png create mode 100644 tests/openClosedPrinciples/core/CarRentalServiceTest.java create mode 100644 tests/openClosedPrinciples/core/CarRentalTest.java create mode 100644 tests/openClosedPrinciples/core/FlightServiceTest.java create mode 100644 tests/openClosedPrinciples/core/FlightTest.java create mode 100644 tests/td5/p1/testArmes.java diff --git a/.classpath b/.classpath new file mode 100755 index 0000000..60b915a --- /dev/null +++ b/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.project b/.project new file mode 100755 index 0000000..3387902 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + Forum_TD1&2 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100755 index 0000000..08c4bff --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 diff --git a/bin/forum/Administrateur.class b/bin/forum/Administrateur.class new file mode 100755 index 0000000000000000000000000000000000000000..04a3d81fcf201b5336ee301b04b4829d831ef7ea GIT binary patch literal 447 zcmZvYK~KU!5QX2CLZMVZf!@6VCidXLgT};|aBB2`;l7j=m(Vs@TK|^^W8%Rd;EyuC zEhNO~Wp<|X=6f^!`u_L?aEZ`^BQSW%O_@fw%T#B2TNqiW(s*zMdTaS2qm9f~(Zgb` zl0u-C<*C3)eCW&yqqEhOK;xS8#SJy1@m#>Y%a_VW4ebCPngZQeXX?I87s@=!#YS07 zp2*Ey8g1+SN4I#^TY)hCZ!OvkM}N)7^A?B;P)9?c$sMa}1pHZEnnX>twd?;r@!Z~k zQx4YnHv}9z&CFrWg&A9{F8B(*^~pQ@*Qy;b`jmk(m!czP!A^t@x~wdq$7lglDy`PH ifXUe#jt`VhW!)wvs5q7s?$mpdb?S31yTpK92g4slVp9zO literal 0 HcmV?d00001 diff --git a/bin/forum/Canal.class b/bin/forum/Canal.class new file mode 100755 index 0000000000000000000000000000000000000000..c225a75446d2c40c18591cbb4f4ca8d1743d986a GIT binary patch literal 535 zcmZWlOG^S#6#mXQHa3o#nwDmzt6LlF%oz2vT8L2459mil z=Z;21n{&_OevflLzurCooZ`@cM#w$};mqrFg)dwKI$?7vo2~sjOrBE`qnp(!2CG^L!p>oEC+^2Cwv%DZfE%yTtil)}~83v9OEQMzBCJV&K{ zJjYJEK1c19ryA-UE6fb$(3vmK99zs%Zqo{hbU|=JLdXmN^l@^Wv7?V7c$?THBjKyNXXM({US3>tygJ!iWnaKQ_q1*dU z9rdRS#xQ*mHgvcS8fY=-z5dh!X*n=aS6Row7HVp}OvFPG2O@joK}3SyI1PC;<(X9V zx@qKZlB{>uW;U-TNA@HwvQXSf#cyv8&(&=>B|)A3PKTycDbtjXGFq@H(yx$Hhj5#! zXPT?`?%)H>!PyG!!SM<^?O`!&PheX9`>oC1*HrtGbOB%zyVbn G4u1h*#9N#I literal 0 HcmV?d00001 diff --git a/bin/forum/CanalParDefaut.class b/bin/forum/CanalParDefaut.class new file mode 100755 index 0000000000000000000000000000000000000000..701abee9604b7791d58cbb289baac106e94c3258 GIT binary patch literal 352 zcmZvX!A`?k4Nj_wr=o!3Xf62(w6H z3}lm?`Tm*wGxM|h`UY@=UW`ECY;J5_rDM`mK9QZsIn^#kD9~BbJEbM*Mf#X8W#I%G z+EfDF?5{F)R_Vp9Kr~cZxsky6V7GiZ69~uVMJ8zAsD&6UHXC@kohdCJ>MED^netM4 zds9$3Bda`b#n8Q~H-Ub(Z(SarOigVId9S=f@BcN|eqCIENAlrvJ1d75}YlW#!G%%)JYYmsFj^GP86C_+N;&Iys5OS z?5<24C*1>GIcu+>Bwn{*6p$Qv19pg-o_VM0en z$1V*$vD_AW4D5`#_L%5^p`knPxN@dmElU4_C|0C~-n?gvNMStFgKJn=&U0q9)(GJY+p)0iljRJtcg#=m-^8JUfs=Sr$Eo#3E(W2j zn#kfbZIjoW#Kb}d%(;DeVc7|EE2!PMWjk}uomd0&c>iD}HJAXKERDK9*&vMjSIT*d4@uWIO=4Tb&kw5Ub#&0tnT*Nj)SN_8uW zur;ncaM45omska585V@9Ck^{Ia>4y7RO&uw;&SZ3QYi`p?Q*?pw9McI4JW5qr_#47 z#NDdAB;0_9SL?E3EqL`n{Z!<2%l7Fa->SQot?JGi@1W;jH1QGy%gd|N#r?4!A%&n&IdSNE!6)3%? zQK6qoo(!f`{2q`hmosoR9C%g%3m0qBQc5EzF~UO;+63lg1`Ozt#7BGW zy;jYm`7ys&xAqp-olsQKzw`SA8DzjX?Oa1!Voy`4<+ux?;*{iQ2DDGJRc$Sp_%g0B zA8fWv>4sBR>!QL!-_;uBEGukQMZ>k_#1JuD=k;O+U)3;hUj!rbGWeQ?GleK>38s0r z-?dN|{Rnzh27xHcz^aOC1Q!GjJ5G?mOguv`d|iWe{?4tM=azVHF{XQUXT);jwd*kq z-^90cyvC;2O!piyQK^a7@onZ_P56Q2*#m-;Q!VsO6W_sG>;+lXJhCb_MA_<%q%-A) zSjjgu?1}w65+%<8J|U`dRf^J^j`TD5o`x|Ma3*;u95pGlt?`b+s(>f)n^cDUz{C%g zAw5k)PRl3Ro}`W+X?UoKGVb22s;UUr8ZDDiC0GJLm0hw-xkaL*3DdFj8Oj`s$DLyf zez>KMHh0-n zJ}jdOAReZKHq`==QZFD^DfPNVGv6=HX>#x#iNSw(}&#lQ)O|gxw7s$RBKL;NTy40+czFberP|jyaA;IVv3IIBFa@j)3FRa08EU zJhp^MPDkVAWASt-p7tvpy(b!&Xj{SL5(c9E6!%;4)CzKnOCf86LNy^!J`>?OPEl$WH<%Fb zVhZo$3_f6D{En%(%;Z=>p1P*-F%#&YI3Gn}E-JWB)}rwDBnrpzGyItGNKtwjKjEs4 zviDH#IhM!`-ufvy($tY5iubr$UZbv%`hG% X?8L9|Yg(8g4pkg%p!f~uYpdIY!LT*uFWd`wIPvZVQ-3HKQc}pk zXDE06YF!zNaB|6DkNh#82eQRO9xynam7q@Vd3>X)l5puO5ej+DP;G3=H2VxjD;oJ0 zlE~Z0qQH=BH2YbQBO58CO_Uib|A}W%A$e^>S}4I$d`mHRY?#O}6gwjHZ|AdtANTlR zHA*z(L7&G$PGW;=(mOHVrkmB z+8XNQCrOJ>(4ld3MCSC%lwqppD0_fG2%zRJVY_Dw6x~mh9?RQHR2QhdX~HhuWdec( z3?eJKL-alRaaMHf}!XdR|bdGSmZsO@2NV)GQz7i+_C8=OQLCe@WPOW7aPBg0i E3y^bfQvd(} literal 0 HcmV?d00001 diff --git a/bin/forum/GestionnaireCanal.class b/bin/forum/GestionnaireCanal.class new file mode 100755 index 0000000000000000000000000000000000000000..d93b1d63b78d59f30d1ccac2f80df90e8bd01e5f GIT binary patch literal 1260 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 GJO2QB)p)@G literal 0 HcmV?d00001 diff --git a/bin/forum/Message.class b/bin/forum/Message.class new file mode 100755 index 0000000000000000000000000000000000000000..4a4a717e85c8b7d3aa84e0cc878c11cbfcddf6f0 GIT binary patch literal 297 zcmY*UF;2rk5S+CgI~a#Ren3Z3;F1DFgG3de2ugo88|NbDPCB3Y7Znl(58zRVJrfDh z?9R;2?ah9De|!SC!Yo5Xm~5=;_vHh3ooYBkLO9*2S5>ykH04vZ3ho}5k@oN+NvJyhYh&_v6{7DK1p6OW6 zsk-5_j1~yvBH`JTD`DT?q@(Y}($@Z7gjVq;g;7a*DXiN6Io6r=#}S!T>82HmHPk6% z)|s$TvL0p3?o7Bz%msBbia~FMcJB?r?F!)wI?rWym#|&VYr>%^K52G{vue^{7kd;L J_6aLE_yWPfXcGVc literal 0 HcmV?d00001 diff --git a/bin/forum/UserConsole.class b/bin/forum/UserConsole.class new file mode 100755 index 0000000000000000000000000000000000000000..c41484510b17817c4f5e2204f01c7abaacccf4ab GIT binary patch literal 3565 zcmaJ@X?Gh}8Gf#;SYvyfMRuGxOFJQK z-vFG&?=wgV>|1lausU|tx4gXT_-@6@AT6->rnza3RZM4nZ1KiTs~iZV{IWn_L2ZPA zT^TEuO~z5Xnug(jIyg;us7?@5_GAp6gL8oimj^<|;W(snd zcK1mOg}LR~>+`e4;>`22MY&O-L%FfESX`m)ZXCohY5hF{2Zwe%GF<9{zzH3@&`I_M+p!kH>J7_VF>h2Xfo#Doo0XF3*>WB) zrh^Teg!&3?!J*h4zDx4^V|OY&*fj9L@;63;Y&KZ)@So}v$> z2ze#8bv%unK&B>dRLEWsOg5sI^e3QKY|qNO)vD>Nl1%^5aQi6@?-w{S8vPlJ+5F7H z#o3|}ukg`Lg(h_jBd6gUMJjui)t3IzOiOX z!_Ue1&gu97&hmz1-3es)x>3MF22Aoqkwg*Du_%xB1a85-&4Mz0R?`c#->jzS;Dykx ztXiIiBGHzlM|0Du?*%q>0#**n9tBGj#U;{TZumyHEt5$l}aZ7dv z&1Q_vz$M;+dfq8?bMg9Q4;<7oaB042p}wo*6X4af3~OuVMlEkL1Mc)jH5il7u*q`h zl0x2*vAE0B9-3><`nuv8KFJO;sxEw5UieH)%wkuMwjfD-PRHl*1y?pYjMZw zUAKY-w|X&DRV#2jnG8jX+0vGjgmAXy)KvQ+CQbXIhF1g*v2(;tV%7F*u4A)-`m(LC zXaru<@g01ZEh^4ssgmrsEiP3~exK{-&P^L+V629*Q8t|}$F2G?qdf^#Bq4I#zOo~D zfhSrV?s#mt)Ppx zF~&rGs5|-3Zz0D)WT0`ii|;9PbKaAf>zwx{=DRuHlbG-2d|zUor3JPr^mE)#i?c}c z4d}}~z(DS=IC$+H9C`rb&p7@^lk0swWb*IveCW z8@8_Fi&%Q%fI ze7}k(6^9(}5mkdj317rZ3|tB;_!7R%=LigZ1z%+XeT^rhq>-n-&Qssu%1NaEgZ<(m z1F{rvyQ_lu@{Z$4VS^OSFf@?D^O`A5k2R-1fp#q#|c_X#6v zI#JwuRf!~G6;)-_CN4AM=MqkO8%p%z?YQcG(`XapG%fp>)@H3!tS)>iQ5NvmLv9x4T`3Q7>6+WR&c>T0@MvZ?52c@jMM0e+M? zMnS}jyD+ow@n+u4zP-P^0@%m8509{A=WK?lb(~yg+QfREvI}FIad?m*& z&Ig3fcJ$M5l#Bhe-y0K3Lz{4bC9KpCph{>&+VI6S)>hDyH$T9L7Y~(!M1@Kaq1yX49qLND8+H@%Z+Q|t_yhb= z;xq~#^x__7<~?TKo7wk|*Eaws*!1BE9GQ%Clp05~8>@7pvXoqy7)#+P z9ft6zJ{7KZ4_&_m~g%CIXen%qYML)*1*<7ih&w({-_!lD(DFlmt4lN!U`d zG2?HtlHV&Qa2)^lxPgGbAm`+~l>W7pKrl9iP3TfB&A0#lqQm7Jb|83jJ``K1qQ=>0 zn_e^ujDS^3T`=f1nwtr;3Iy{z6B#`q@KOD+%&$A;bP}&_=>_YS_9r4b zycatH>8GymMje52eX@F|(Gy5@gTBlni5n(nkrznT8@*Yuzlj;7RaP>Qfgw=Xb$$6# zQ+RD3dYVGu*j~>LUA2!7Q_*{OAh5RkUybCNKa$Z9E>^TqZ%nde-QZf?;uJATOOAj$ zBmERY2XcHoK1uo1~$oYt8zIuq9@TZv4&*>7KivwHE9WC_k+{WkuO~3yFpTI z#Tr%4C&?cx!H?t88HdF+&6`QCL@6Cp61auiF_y)eOCrV3*N9Z75?Lku(5wzMD^t_W zjlVn^5~;D>`ag&$N0b8`UySvJNQy}92Py}pyBD~xtU1SesmZ`;Y^l7>aE=FK$MTv$ U8*{KYf0Hy!HhyVZp literal 0 HcmV?d00001 diff --git a/bin/openClosedPrinciples/core/CarRental.class b/bin/openClosedPrinciples/core/CarRental.class new file mode 100644 index 0000000000000000000000000000000000000000..8d5442fc5eb0519c7a3fc02e32f073ccf442fe1a GIT binary patch literal 2613 zcmah}-%}G;6#gzrNJv(YA0bdhQACrFl1i(hXhf1~qbO7;EmGPp$r2Vq5|d45d~c_J zgO7dci!-(}HO#a#K6m<$^uMV6?%ib#NuUqey?b)*cfNDZch2Ac{_z&T4Oo732~3nL zMk!q^*Npsf)hy-AO3|n#bLFa$OzYLBM#<8Pes~2g9q+iTzc5RMtYz#A^yKvFlluOa zQ56_i+||F=lSRE$NUm5!FU$!9^7X22ndOpz$kKnyD43;;ZW#h$+ut(xjpSlErx&G} zSGsSTCDTd?B%70};5Tdcwkx_tk>8`1{#SzbeevY(46GEsNu1U6)_L%$eg+Qcr_!sJCF>h1@_>#H1voXHmZj3uYtYTd%Z90ez zZ2IxF!0A>P4J(+Cp5JQt4mt~}SGdDS>BCOKYE!#IV=e${Ig}Vb+(#<9Au+cF&QfV7 z+}xoE6XWjcQdf87)x8!LhiyFpi%T<*7*|pwjt83oR9NConc}8EaHU+Y=8XHM+(f-@ z*`{S#aDk)g;Wqc6OD;5?y5u@jZ!R;wL$q*m>351>FX$<~BJt<}dgD`X&>s(b-(WC4 z>U)FmZ|Y)%&tbv=gM1DVCXCax3?qUOT0c?$MKFpF_(d=kTBy?*oMk|1lQg{QB#HP) zAcQf8#s*2q|N7!n4V>fe(pcgE(f8ql3girW2`59wZFe_hA1zY^BZOSq%DYd6^w65X zgcB&qxAgMGe@FkXJamy67+o4KDri|6Iylg5AEs%M#Y)jz=F+X|)JkrWcP=Z0VcW|k z*X`6pAc>D0tY#vEuL#;qB-)Y4Rm`*zIm1@95}9JS#4$u<6J!NGX4CAXnu&y4D>B`Y z$TeJVBSPggsl{%sjPg6t(oO-@Ta}kEp@rsL?`4nXb!g> zh<^wn)tsGLzvX*--RnvHg4t2u*v#Vu0mBX4c?qBQmGhB)i4k>_!G3JuK?9G}|37%d zSlIjXyT3fLF&?Fmi)x5c=*L}3a31HlyJJ{j=rnba!UHa7Da>&-ep$EoSvGe}b z%SxD^(<=q##jY|^7i#|j;(!EU literal 0 HcmV?d00001 diff --git a/bin/openClosedPrinciples/core/CarRentalService.class b/bin/openClosedPrinciples/core/CarRentalService.class new file mode 100644 index 0000000000000000000000000000000000000000..f331bef917f555af22f26047660881e2914b4edb GIT binary patch literal 4586 zcmb_gX;&NP6@FeV42TgBVz3n(Z;6QzVA)AbY-BqnfCFX^E-p^mbdbg{M$9PE$g#Tb z`@TEfS9ft+r%i;h+a_I3KIHUsPtWOJ=;wY)n?CQ%Xn})7PES98M(^Bv-}~I>x%YkH zwg24t1As^I7X?0nn3d7Z;k1?0Q?psaOd6TAo{J}~tR5fMvQO%!t)=Jn>{TPFD+mZ2 zs%`I?2?UZ_HYd`gnI=1(Vm46{J2+s z-$ncCT^-0h3r!H{R1rjjKeKnPB|UpVTS~JC?UPngOD||yLw@%b1NMr+BKFm< z#U_GSmd?$g3Yk*4wq@NOx~dszxdn^J&`~c@+gQ`%j^Bu8>xuE6s)BlyjlW6LoogGy zK^#_aNZ|h3B+EQ5SXMfx;(k0JpfLFnt-zd*)=K0lH|Z@{Bv0Kc9z;~2(XjQbW?NZS zDO!zj+*?mHBZfW&y=0`qdFic+ejKGPO#PZIu&Wdyt(nX5nWZaw(oQHiCeT$I7Rw%@ z5FS$TFdh+THgaV~1WrclGo9ETVb3LraX@85pQIMGREmw~6{$M6o=Xzlpo#=ev!E+l zZrTAt^3^s@-PHpj*K#Z7ZBgTLn+n)gZ}o zn=6DkE~t1bI2BqbM7MQk(}cZM2lF;Z=yD>2IlN89qV!Pd!BDPK2v6bd3Z7=3PBIQb zu9J#)NCF%5XY*P*CnLO5g@z?Y;8afMQ~HqX3V}#;`$9_^o06rZ1&-7&xr>bxBd}yy zs{&8&B)@Id!C6sP?&V!Vqt}vpMye>Mzz}$}w%fF2&sw>h;m#>HLfKo2eN{zT)~YdS z@pLlGTqCH>F#Qg$n$~mXK~^Dz6=dWAOJ)tH1c^6SwGaw;w}N+(%i7hd3ajEhcrOd#3`<)d(KA|>;C7cr)#gs3 zN(*?uiVxs}ET#0}flPgIAdJf?^HoyQ9)_!`2$pk>gjzXYg66RcD3$B5=YRSTzDx59>-C?lXhWtM~%G zNCtA2#2Tp%RAt)ZF!f~>UvZ|NksDph*aaEjYbw5uZxA*sAf-||{in$vb7+|nIQq~0(zrk;*gtf|&z+bD6V$ahJKBk!|UbP>Xark)*6Yq^}x zGvyUd$%^5of^Dv}f*c2}CA^35}} z_VM$c*j3(O^e=?#>V$|Dnx_94g92gA5UPMO`M+O^i;83Jt13dz-AU+t3MS_t) z5y!71)E@~JapIzUdx}HujeqptVxWMN=zb^YK4R@cEB5mieE<*f`hJSf!@QWw#Lu!0 z+_;?hD9&(ACOnGA@D?W8$dw^l`59vXkJB^2NbMM*MGz%`u2mzg&e3--d~fiVqChBk zfo|E4r?5dST3lL1_6?sL#YiKd4+#wg!j97mLQ=A#bU7<1=lWwd7;6cX(j2bqs= z_8^Irhhw+I(So3ZBVNXEnA!6%VeZRx4e;BFgXZrJ>%fF?xqB5Yl0rhb@;t(Kv9j2{ zwhrs%zAi~`FxD%{Ba3_QVs5dwuWKDy$ML)bm-pdfBp}&zu^lE8;2$1-7Ow**$mIaK z`B%d+oWyBzI!2TgMkmS`C(0Nn9B!q$Cme45j5X$<4KUIXrvgETzgGBPM~8yBrq>ab zu!S7y9%ug|V#(QLjKHq(=Y2(dXsYiHJ_6jvCpPdoAH;Ou2EHUfs>H2WpML{i^-1kk zJg!gQK=WWg>iC-%DOw+u(ajWANY`V|rz_%a-ta&nhAG0mT<;>BZb~nTCulduZ{s*m zKoa^RZeC^RllTt4%dEq+{2r#9J>vMjL+=Qs@&o*kSV|Iht$su+Dd9Hw|1Gi4unLO` zR+P3O*5Jo{TjKmD4(HumktJ=A)%dBT%jYzo95r(6$h_qH0DkT~{lXhJH}Ok;m$TtT W(on=*{2ucEI`Ra48Gpo|5&17dn!^eJ literal 0 HcmV?d00001 diff --git a/bin/openClosedPrinciples/core/CarRentalServiceTest.class b/bin/openClosedPrinciples/core/CarRentalServiceTest.class new file mode 100644 index 0000000000000000000000000000000000000000..0681fae27ad5f41c4a78952b27456948ae5ca0e3 GIT binary patch literal 3172 zcmb7GT~iZR7=BI?vJjSv5W$ZsA8Jj&8V~_BRQX0|KqQDpZS4|QT#Q-FZV>F(MW@%j z>r8KY(~I79rZZJ&op!uvr!)Nty=#9*r_<-`ZoWXH%?!JH&Uw#ypZ9s5cb7l@{pl9~ zgZNZ|PvDffrf0`8rlsGR&l%aYv6j)TSlZ0#u`w;Tpl59@lhkwTMp|FgEn7iApm9}O z*J2qhyAr#+ysD>d0mX7-1WqPi|HQaJ@WCeY^a!+7-&YLnE$lfhP@m4{a)dap*}A~K zgoDdA9_X=znbtCLTJ9S%vW9&@z#oY&2?WN>J9-Fy>{Zc#Hxx7r9IlGF7W)K3z5KP0 zjJEd-1c#@|Ab%k=;eb5lpg>E+P4Cc>w8`a4d_1~T2Z1+LD5$N)k+M?;`-8(N_Y@h@ zsiIDX94iYs+ZP;Oc<#i=kci5BwE}w*MpmE8KUmgti`sIAg*Q3XE@?SKj=jl%eb2B2 zdaBd9OJMRO%AZ! zN^CVx`eUQ|U79Mc;EX_5Rk|xMDHteZ&f7*NHj>L}n+e0RLpY1`3eFYmSX#AI#4$wO zHA@Bx9FN>A)5f)IJnBw4+hkZggnnF*VqRoXo|w++n3>7YET+GN83ogYYAbE5;$0*JeCAz& zgOTa!X%Bv76c6dcoQlhsXNHwsNh2QM9lHvLmAI&Joe94rWl_ad$i}gZ$8;OJXgY-J zxS=4$ETu9=EWQM66*qB9K-HYl#KXLnVYxMtnHkx9>Y8aeK5<#_TDGK}qXe6&($Sl1 z1y>K0sa9lssJh4F7ij7hDZ{8~-XF6p0)sENnPBWw6*m8S#8aEK`D47aP&2*W}6kIn=>oK zlYBf@@uB1+_P# z+JWzI=gt?kbLZRGxz|JGJ;)vWobbAbBhwiJ{assV?0SZ#R8u&NmM!dmf`hgMk9`(9c}30^?h`ffxle@KSA)mBIHRAvdvO_eC}kHvAxRQjdhLn+nB0(irMGr zPlR!$`zey2Z{wQG>USt>;vV1x_Tep(7NL?+Cu56yl9#cC^u0$k0=F40sdQ&P;FEw> zLFMvJT;eKak?#0S;^N<-3T$^0-M>Q#e2aj88}}-q2MB#OjLgX&krj~0OY1623szZg zD6L<4(f&HFD^>P4bG^|EC_6w>7jUQ>pn*XLwbDIDDc1lCALBc2iJnVyw9fw;Kf^hE ziSzgdL!jpP6&D?P+g(CDdRy@w9wJ972k-@nwn%<~Xm`fuOrF_7@cn}}1?$6-_>Jns z<7*Nx4KYJYAEH#chV{=B}V^ZS7C;tHyYvfh{ literal 0 HcmV?d00001 diff --git a/bin/openClosedPrinciples/core/CarRentalTest.class b/bin/openClosedPrinciples/core/CarRentalTest.class new file mode 100644 index 0000000000000000000000000000000000000000..f03eb5ec825e38d15e1b3adb938e145f7fc633b4 GIT binary patch literal 2213 zcma)6ZBrUo7(Eve5H|*`Vl^giW2~T!Xi`%XQX`5QDvhZcT20>;T*(?-D7$3p*Zze5 zf%aqjA=Bwhqf9!J>5Sj<2imXg59##WWyLqbl!0aMeeONydCqz6ef{stR{%ah-Vcw! zNU@}w^M#_NZ#^sFc?EH9FV5q6UHLHS%VAPN3QQ9)am?Kb9vvmbycu&An+!pAMq*AG9 zP4CmI;z0~!Tv`$nn2t1;Fy0U$RWof;fgb_s@J$8pV@jYsuiHs&j~$+)b!?`jZ#Hn$ z2*bFo;Er4t;4)`T5O*=-$A9xkVDdcph02zmkbF!!(ikMV8Nfq<&MmG|xA;B$Ia{&Sm1T*(s$dQ4?Bkjc z>*WfO!jaAMM=P2MfYS6hFo!>?6;s_QR>~^x7SoncpDEaoQ0+CSMJlQX@R)Gtwv@_; zKUo2M!Nzl9P9c`AYHr{wf!+_+roBHdeZd%`!H{ljS)*0{!e zbNZs;Tm<#gB+tyaJho7Ib+mA?hd%c+kgZhXd9DFGA?%sGoC6Z6hvWfFs_61Z}|;zI!$%XT8w!N_7z+hYVSesnwh`_O^qE6Q^!y~+m5p44I&0`c5-m~A~I=;s^e!v8tV-hcM1FvxtfAS)f zx`u0dxw=O23%-U%{{*s)6vk86-Ki4_|4nyg!mhh)Sl3{>+KpTzi@VsBz%*01&4lkT QnfM8tr|LHAT;;*`e})nS^#A|> literal 0 HcmV?d00001 diff --git a/bin/openClosedPrinciples/core/DateTools.class b/bin/openClosedPrinciples/core/DateTools.class new file mode 100644 index 0000000000000000000000000000000000000000..c8bad04570988a180296b62e9a9a79bf8ca12052 GIT binary patch literal 949 zcma))Pfrs;7{;I37PehVp+zdtDrg1TYH2)qD0%@+N-CNZNsOoMc2WnI-KM)Wa@SAc z$&*)4Vl?XAujAQ2&+Il3O-;-uv-7_5&hL5Vo%#0j;}-z8aKnTlQ1%DX+j0Fs_8tzE z=cs`zgNEY|Wn?Jfr+HR{E_|KZn(DBZ#?K8NhcJT-d3Ip?+7F+)kA^gj^C3O z5=dt-g=rHr0;}h{TCOYmw%ZAbz5BwEgHZWi3bO*Uk3!|D@MO(#?I5sVVNMg~1r{sq zb3iAg!G2Rq&9#*$_eaNFIXtktt`x|(eaChW?V-}~IGGHesz6}9{U3*H3Yd1Uw`-qp zM}4dts$*JX;GfKFu9x;#7lFY-M0r(UrlTZ zSRMLsDXi94-FA zSrU1EKqjun0xmF0YsX_!Ga>_Kt@!FaF23V(jL=eGnciNAa3(I{G9wma6>D5i;|i{h zL9Z#6#xP0c9PPif?{>uWOM+Z4DM%ax{H5bM!J(kE(K-{P9eI6O zq%@UFRHFF;fwe>#%5qdIQ7(*@OO&Sq-_=W0q&Y#09mka?DtkGj`XyIH2@c7oDn$eoBN8Tuwrza3IU_k+f11YGY zFrMf83G-L3d19&r&2!a6W<6qxB{Er_LBnBTJ{VV?Yr_l8Pz@GOy|LeuZyol$Jn@|N z__5GK%qWegs8Nc?h$zKFR69nfb_@`E5t$e{)&-nCB2QpnHGk5gDXyr(OO+ShOkdH; zcU8KIwV~k3pr`9H$%NkhLaoSKU&(R)h30XMecA2@M8cwN*TV^{N{Az(E=pNmV)L7U#KV$x&>Nf-_ zfKvpriIVG9GB>R}Q2w%Chsb7%tcfNa#fX literal 0 HcmV?d00001 diff --git a/bin/openClosedPrinciples/core/Flight.class b/bin/openClosedPrinciples/core/Flight.class new file mode 100644 index 0000000000000000000000000000000000000000..fbb02f76c4ad39e2cada665fb1a2425707df6803 GIT binary patch literal 2904 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 E9DS$k0ssI2 literal 0 HcmV?d00001 diff --git a/bin/openClosedPrinciples/core/FlightServiceTest.class b/bin/openClosedPrinciples/core/FlightServiceTest.class new file mode 100644 index 0000000000000000000000000000000000000000..8e8fc340a2a4c2a9e2374e0ccf1d03e987158a6a GIT binary patch literal 2212 zcma)6ZBrXn6n<_3Y)Do}QwV|9+83&Mk#4nBkWfl^Yl9IGXlkmCZjwt_X1g1+8?=7+ ztK$d#W`Be;N>FAx{p`Q+kErMFZr+&zGTgoQ+;h);&hwmm{{Hu`R{&;lAi>9wGOOHJ z(M^k&w`-bF(yBVQl#*HF%DS#q4(wfCJJL#gk6X5c0fz9QdZa44YE+c1;vp~D43g#g zFeGvp43}mYTF?y5US#mc6M2S#6|>BP@FOHcLV#g3rx|>+{=CR*dumbV43V5!QuVxA z)5O{{4%i2p#V~Wxn?)jY`=G_`Csl^v+IJ;hwKdbQBwS{=+)l5x!!Ws1H*D=W&uf-O zS7!{vv{mPjgQ`|h4(pVRvds61xwM3dW~92U=}M+nQ(xpX%MK!nkc26Q>*o;_z*S;) znd=mh&Q0Q);N>lb@p!I{an~l%D(OUCM7|;8CT-fhlom8tUvgzS%HWU)aNW0>DEOvL-d5obx;dE{h#f=zla zl~#OW&tsye7Q84<(xU3qgAU<2CjVHuQ6-($KU#UtGm z3uelK83Mh1HW}_cPQUaXYrmzFuvV`iL4&(yy;kDun&^JfzJ7d1aEKdJb$%k4(La?Q zjRQ2N7E0qVtrYq?d&vfZzmdTQnZ_Z<7{(hkmt6;pV3bzG7ajKF63s=Z2*y1Bar%mo z|Iz59@5@s}3k}3_sZ&fAB3BxC^BC8kx~u8V)fnEsB>fYX!?6>@!%}$W1a~6Sk$Vk% z&^j@OxelM<@U?S&BCgN92;JqxNuFZ9kZNGz4?Gm9`khp7QaZpmjZykdU>Y$zrY@sn z3P0fre#KRXhNzpAM?(O=AcJKhV1-T#id@So%^22bXmp3H2;)ci^1!aE360ukdvT zPS>J3IE!cE{Mo~~=;0Jn9HW#AwxM(*Z8~%%(~CAi<&z{%Q@Bh0{sG|<#pSZP=%F2@ QdhAB)T3odI7o0^_-5Y(z+C(%W;+J?A;kdFije-+lm?#uFIM4BNqV_K#+ z%MetPB?f81-sBMk(WXE~SVoj#@GO{6W{rr`6G11sWW*V|d`_OZ%e8`S=#{MQaRmvS zBX0HYlORQc6CiyIy%c{UT->L_7@#tiOoNAUk)dT-cT6_| z1%slZA%+z-durbQjXv6;(eLf5M`I|bPg;_tRxn&v(1H*{N5QoCQf+sGJ4Jn?!WrUz z2TH_4=yjvyZJRE`=$SJTW2QN^xZHbQWr*Zn8@%e7w<gJL-{7uyI4}S*cl~`6bge zDd(JJ*`DqP`E;DJwo{|AYx8`I7K-2%kJ3Ek9<7=|lw$?E;o}n!4V+YP12-AM<%SdYHHXw}Hk&Mke*QVy8U^6UP&*U3`;N0%xMj;`FtBB$X*_1;pjFLs7~1n%u&rfy6i^X>y= z=@X>j0p=Ul#rGeZRzW1_*Vj$`0(z*e0Gowhfk&XxOzWxkq?yqZ`z#|BH_}Nx6N#Ia9@(vDY{N{YG{e#d z%p=;co>AZxC>_zpwMbG+4M%zojp%V(z+;;N>$;Z5>bJCUJ=tRoYboQXZp8%rTjNP1 zW!T#U3hL?y1ibBLLRU~MQ2#&U1Q0-piWTq+__jK5MWBT$3gHu2*=3~kz1guty49~8 zO6mf^E;Ftr2QWF%@TFH7S*#l`f=VMmkgJtW8v18;b={ zgR|wT&k?ApTXIVMfYflFiZwW&1e;kpX%ssJF-K5EBbo%1w8TnETc<5?0%K zmhkjqZ_ZiR%-Um}G9z9s5MEyCuB0)1*!Hz$A7hyU6Z`-!m5N^@&|BBBBC32zEsR-N8kin={5E483(R%+q=M@OHZRZ4Uen%ZW-Aw z5(-DdfuaB=a8kjfz*)-^FPEy~4&2FohWvJNqhgu{b2ZpWW?4gG#rO*DR&bZVirE8# ze52y4_!?u3(z2%Hc7!=cE{4Eyd_yk()Phy#s?MUU%dJ{UeoMtY&W>!G?oRE;w*{KJ zv>EbsvTxW~OP8D^%`C}rT#-%b;Y8LtbrT=1JMNQKd{^L%`F6UvIi-GlpPPPogx<_Z z#GFU7f%VHXydxXWrX;WJre*1ww3$k1axeF4)-b6qU*aUj4L8HO zUhdK|_bA3AoG+nEgXHmWVQ}(oaY7!1Q<~fcSs%H2ox6hQBxF+7{3SD)-b*GdIYqi~ z;S^_sA_m1T$dmDNlZ#M8%>w7-neG;LTI?BOZhM9{FaU>~-84hVX(JZwCA4!$zRj1r z^EV8MyitB_nuVu2!bqiYVy(_&BTJDqFz(Eyfdz4?-5a;$qanZGykhU5NIT-RgD3=) zD0~Qd=fXTlc?%<9)p6&t(|*`AG6s(-d7zxCCeV^+%F?k)HC6MkB1h8hbwt`eTMcFo z99#3KnD+ZNg0}v@veF+?u%yq{;-lSK+PM=cct{b2^Dig1ywPyW=wlAY^<9R%PSq@N zC2Eq^<7{5T3b;E`K;FgJDu5pf|CsIUt%JweJBz0f7@UN98&=-R0T0Uf?c*eQ@(Vg6 z5`;IrX~77e@@?VTNt7=XDRM+qcLFL<$%#d%LbWSg*iV=2`c4(G^vu&^y@B7%Hsv zPNF~RpTdE`3Jit{LrO#ABo0Q4+>zJLjs)D1*U6FKA!iZ^Nsy4Cs2Wm3MH3i4z-M6k zSuCGZ7#$3$lNgJZoWROZ$pq3ajO_pi$EB_n?$Bi+UrzhV9B^r{aAYD?^o`po3Z&DxZEuO%5-_pK1pu6snoQ2}zt)5@!{0LRF!l zq%+>!xV%*CAy4)j9 zi>Gj%c-}MO8N&ncI#GWbQHHCEVg_+Je`^@HVTSG+tm0j}7OnipKsys_AI`ykjwX0N zA7>(6g$7*988@N{w;+Psv7QHuX55Pw+>cFof|Ac-GhV}p;-d6jtOB}>*5$E-E6rExmd&Cv!7FY9*c@28R4cI4c=B4sB^oqNAbG(Naxd$;Q z9>pc%G!BZVajAG7n#YTT=S=9H4ScrZuxB?6&oG}O81a}G^&EvM)0Dc;lBtLv;UTWO z*ptSO@e?L$jVF$W@d#_d8qWZJ%2okdJv;F;{G3d+d$!;g_$7Nl%9aoNJ?G-=?M5P!f+t1?fs3L<;;~#umO&%Y|b8OX+%}4N0&I^&tyYMg0TSW$o@jU*GT5>pq z|IlN#WK52|NdLb?me!I1$99%L)wPbTQdg_sChy|16%w+*#^HU5p;oJi0tGdS@bV)R sbU2@G1-%LmNthPedcaKp13z4U*)c^nh literal 0 HcmV?d00001 diff --git a/bin/openClosedPrinciples/core/NotPossibleCarRentalException.class b/bin/openClosedPrinciples/core/NotPossibleCarRentalException.class new file mode 100644 index 0000000000000000000000000000000000000000..acfad9e48ec2d09faefa014d4bd4046898cb34e9 GIT binary patch literal 495 zcmbVIO-}+b5Ph=(YZed$!Ni-M{7Bp*F&HkZCYlW)qTI{UV9nBQw#E3jJehd#2l%6m z!)o+k;=vwf`d;76yy@Hf%PW8$wtaYnp2?(+Qe)+8lq;R6ER{A)OfJKraU)}`nx--m z`L)zer00)`%$zdXM~TqB7Y`y#g`S7s4}_+bxf1C_=9Y!GmuCdJBGe|CWM(qJ8a8SOP$e{CrR8wBn9BS{usuR6HVKau zJectpS#o#E5>DcO?${^z3u&#G7ZZMYBLri!%oBN`Rvz~L{IKIyId(z32d|AClu_aA zGxD&`H*SY2#~L#O<~+`o!=q=^p9)QbV^FY7uH8hFaraZjsKto&Xk)AB)nVkJ`vIPt Bd_n*K literal 0 HcmV?d00001 diff --git a/bin/openClosedPrinciples/core/PayingItem.class b/bin/openClosedPrinciples/core/PayingItem.class new file mode 100644 index 0000000000000000000000000000000000000000..d8999946e3f332b319b3052ff5ddc51c60855921 GIT binary patch literal 681 zcma)(T}vB56o%hp*4@pz8XHr!HT{S!HSxk+_9Eg%6`>HSpai_!Y=$_p?uN}q@LwtT z0Sf&A{ZXawBugxMBg@X5k2%kr_spNa55EC?#}@}Pg0IOy#k)~5RK3Gg$DtlXYS;{u zR5cHSOC9%rX6oF5C0INQE`nwh#Qo+$_e_PEV0Mt|PzhvDU~lVKXFCF`zSrn*+f91P zLjiL>9QcAlz0oN`u;61BwxHD3vHCSS@2d1T=tjhp+esKiogmf5&x2NWs)vGa?bkHg z61aVpQHg1bH?lEzI1RX2a+FbJUr?zx+E0Qe(UyaEf|cjtA0r+0RO(?Bb7raf_<)a8 z91J+So}fy_FJO69%T#>!v5Xagca)6MQ0;4@w)8aLEpw$+<8TUm8qUs4h?Yg$fy=c> zZ=YF{_crhOZ`@-3n%)dbTo=X}mlZ{R9u^r}W{#)v24(KXGF0JHE}=qS@OH}H$=UWZ zt~X{Zv9j_X)1ETz36m@e%=_FXOUN%jV)f)6?>BESe}}a@e7a(E(l7gLeq%)mjRyHiTQ$EJqZp!a344p&-SOdBTr)(cosQxZ8LlG>>7z<{jN^?Res_qPt|sRD7ql zryE6SDKU&z^_I!Kwj&s3dbU?#zB`V+?aM|lXRfa?mDNly`u9G8lBaD!$nD`A+6Cy#|o8BCF4-K}S& zV^=>CQjZKdD(}_v+B;P)jch2FCncsy81JjNjEj=dEfpW)HVKMGLCVeTgzRGnprqg< zhNVG3C=YKo8S-a|AjU}+HJl?-`MM;treX!3NE(3z;w1798Pbth7_JRkc9QZ_dk=Jz znC+g$Y*V49KgLz?8NODmlHcWKlN7yFv8<(`Gq!;n4#ZkN(Tx^QKCtV;~XY1OP1Ln80T?;R+J_Lo$K0r<8*Jt zC-x>Tp3=DF(^w}vBd?*tugLyPF9EFN4+4`=YTyt;Nr1>A0jNoRY3l?dGtA1gFL4EU zfyHCw6X?c~T>(W;;Zh81whv2M0<0o#o|f>gUqUs+$`*ddd;2nf@)#c^@E7hx1qDD0 z)TPB3P__?9S^}UIlum(GeV|9QmULB#v3!h=6WEU?6(Hm=hP;muOh^q8WYa!{>~=IE zxfe`G?rnh4f2%S!31f>;QslcGO6D%DcF2~%=b_~bR3sDfsnW>4#zTCE@5v%RT|eLv H8kqYJ5Ic6h literal 0 HcmV?d00001 diff --git a/bin/openClosedPrinciples/core/TravelOrganizer.class b/bin/openClosedPrinciples/core/TravelOrganizer.class new file mode 100644 index 0000000000000000000000000000000000000000..2c330833669a4d1757f63aba0ec18dbf563a5e72 GIT binary patch literal 5056 zcmb_g`%~Q375?tBi(oCAH!V$TuY(h_3m7-GvCU#?0(MLc*bNkn(bovkUpNacjN$iS+U7MNyfL6LX_dDl&=W&nt z_j~XB6Tk`lRY6Q3?c@!6%yJ4w?viWTx|z3(!hr6$#=xwrtr^xucUiN|XAM_DT%h@? zwx$hOn!P-5aq+65djc(*=~||36vmv@JVlKH#U_2ZqGwtIlV-uo3N+4`%eLkfT|*#S z@p^c&x)tXvb9u#^G2As%H?ku{YSuOP3B&dx`bKsEI2P>ItSDyvuxXp#h(KLWdQKod z=H!ed>d>TO4^#y$0&QiNMqO81mwqMDjHX5iw5v#T2t$ zR3&*Esa)NSE(y@Nm813iCQog2IgDH+?q_!8+>ViNqkr3hM|b1M4!F{n7A=nMGOiIZj z)2^11OWL|=FH6B}daePF3mo?YkXm!rwPhn^8z~+_VH{Fg@p_73_in$=m6U7fD~7AD z+{IET2&E6rL7nFg?T7JcqV* zZfU0sj=!GWgHK{nfyN`O+=n*bs?fnM6t|7*q^o@sA=-@;kfFoX%?gYUkK-f^tf(+$ zRm5e&O6}KFSYS#iD_UXNSHyGrN-O6WM@1f=5=dzIyv1I1VABA9_E;*~x@;8#=fWHM zQb19GG_~xD-=2M6RjlFD99I0^DHDi!89fTN14fVBG7j~mv997-e1>im9G42aqCgSR zpwWL$#pit&&BEE$ytm$fFLEr{tO+Yp4eUy(+pn@vJl81If^kG@{IZI#;Hx|tcv{MO zmLEI4|QyMG5+y$gHMY8)W9o0I!ez;$YY-$ zF1+sLyN_{~;O_&Oo7k7Rh318uX#G3d%C{YF`9SaEwH0w*TX=0n6WZ_rwB!9;kzj;C z7gxah2k=1}5*Y9yU(EnlrA#98H?+OUn;0aZvrgl`C+P$Nxha#pvwB1yn z!KkS{RG+S5Y7nfbsf~WfSQGQDr(^t8N= z4#oTLptCD}2Q7X5Z{uuVSDe=y*n10u3#}73ap7NmG6(^E4>Om6Azrggz+rUaG^roK zA&$x!oIyWE`R|J{-^gQu(vsV!FpY~esu4$ViFqF*LIzJ@hS;6x#wCQ>K(l2q48|x`{iM$@D}eJ% z;|Ui3A=^S8Fj?k=M$6Q zT2L~9)Hf(42|A3ryW}jPKq&a8!dzB3iQ&Lq5?WVYl&yeY7xzV6#}33j=M(pxn#8?O zjkxb_A#S0PxOozHneHvn*()UONfLLN#63k?p61E&42je3N!*Ji;$FfdA#pN~wi5Ru vzQ0@I>hJ^d9K#RsBmT;U_H)Aj62HOk{JR@?1Ao9D`A)X;KjANU3tj&MkBlh{ literal 0 HcmV?d00001 diff --git a/bin/openClosedPrinciples/core/Trip.class b/bin/openClosedPrinciples/core/Trip.class new file mode 100644 index 0000000000000000000000000000000000000000..e2513652103ee338f50c0a51ca1aacc6031c09fd GIT binary patch literal 1532 zcmb7De^1j;6g_W0*(hvoZ2m@2gtaI||Is)?Vjw2Q1xY}R{#UkUJ~G;+>rD7onn;M6 z_yPP-#`E54H>NC@Ca-<>-Fwct=iUDN_3a0MCwQDiLSWwSy53gD@42nrKzdEt?YKR= z=?AX8AINSNDS_gV^U<+8j@PzdA0D~QP++>{_L@8orSA!>G%iNj9wycW(lT_9dxUIg z%zh|4c0=|;9_99A+jGKx;0in)JKmT;u&-Z>)HVXv!)IEfHtf zesl@X{tEtw^;2Yvz{|C9Y}HGBJbGzxRb4&r`bqbX^I50WQoPEW3D%4Zig_>%6RTNR z^ys_^1|Hxcr-zsVl}PZ&?AOiroGPj5mM_O9kl*wBLDPL9)%4`l7_2E)EON|}{2LQ| zIFtH|GskF7f9E-Y{Mle|onhn^vjyK3>kPA&I7QL=j?%j`%$=h0S(jYpT0)BJ4A)r# z6)=Y)t}&uuSd8nq!M6gw83Df`a6+AF;MK{%WdhF;xWcunfvbb!2v||5ZUmoOxE)d0 zdJm+nFDQN@R{~0_N(0k|`qHt!`B>j3vz5M#rL+w@&Fkm_=@v(XWMUziSjZhLFn3_< zqBe6>P-R@u(mw^=#l0A0NrUWi9}Cl0kkoArgw;rIULb66&-dBX;94@g>%8`887q-z k+Y!1!&nl~5QA^k`3m3$W=#|cG`Jh1(bQ0M zF}Yzmi6@p!B@^>9<|dsz6NW%_ZvC$n0pFyZu-z#EPfvJ7z_`of0eDaxgcm-6@&!9# zEv0wXE$6XZk6Qwj3(1&_uSmyMd2Z5hx9nYkriK5rm=FlY980=ZmV&@|&%(BRE~9ao z*o-c_j-A+?xI7a+uPL1!D>}nrB7hL8OjHU~6cz}g8Z`p`ExEg;deM#D_u~rZW|Qey z+_oHbygrBqG_rr|Sz5+Pz2+jB2kYBb%$*3Y`O!>K=2DjBN2`GMp4?0mwiC{$ckQ@| zs{)~1)0*I1>e~k@*nv)^U{^umT$kY$6Fmh7b?E@Q(P^Uhk6*gzALbFYJWy~{Qwg9S zoyxkQAcir**5r0F?NR}@c9Ef$P?;@Un?u@vb)!C?O9H1U=(TGE|;5}Nk0FNjJo6HHI&~=PzQI0T1RK#i?{>6-Q z+{>f=JUYmuL&}!jcas%|5IDmiye5Q+5Pw_^QEy%)yw3OtBfnm3S=Xu|E|NQseuK-4{;X#eS6?UjXsMFP z4;_sk+(V}aV;6KY#%7Va`%*V?HiruQqim5wVdni9MdWua;W>6q8CfJFh1RhZq$*}IB~HQD8lb;R(5cLtVSUMx>|#dbuc z-I9)FNv2k?z9qOIp6W>88EK6PJa~S!c5}{p5sk5(E!srGy{ViBwe-@{pU4*T zDRa(J8+vXV`sLE&eeSf2pDCKk#pc_?TMfK?d*P#0ppKF-W%94?2>R+F8h%0ZPrTNk zg}>4bG`^xFG8jJ_Wyd7LOV_rZL$n?txEg3bL`UprG>1#*N}dG?K%-e5e|0pVo;__) z0fUY^EB%1_2B!HCHyK>uBiwS5h*>6aQ~M^oI;NFy`$wMBd|clhwOD);rDvP(e(l|h zzxj?{)dGDbM83!9KBjmXRF~`f7~*9}U26An`v~_|dk--h-^a}(+?VGl&+SJTm*+{I zb%}}RjyNGPW>>QBKxS6N^pFN1fF&aN46S&MHf*3Bo9I9eohYCSuW$peS)n9vL9zd) zjFous01t^#o~C%JVH6i05x zv%T7>#zVSg-)1oDP>R2pOg3cMHQ|~hv=Zj_@K7A^*j2*gWS5e~e?U)J@*9FBe8Q$i z_RyqFoJkK}yTm@+;^5le@gL%hoG~^NY+?=DsIjnmgwTjyQq)HR`Y}uZBe+9AgRJT< z$r-|94q}|&GD%jCQ{O3B%ZehwcyWA+6;*!>Nky5Y!w>BrGzu~3mcz4(HCi~s{#=cC zKc$jtjit*fD`)$G%BVZ~az=sA@!~Yb7b?aQE#$Pj!{r5W=D@Fn(=2#K1#)KEeOkJ^ yynA2L)kz{HURBUnF!+``IK?P3xQ_*1SRNzpz(Cud}C&cW@#()aAVurbQD4_?DD3ipz;dQ-LmcQv|yJMf+c%Lp>63nWYsAb zN?Tcl@JyjpaB}oXB-a$Q1^c-bg+jBAC}Ij-iG2QaoVdo83MFf0e`mugKQ=dt%-gnP zZ<@t5vs{q9f2cVx3wvU#Rl(#PiTcp06h#nSLgAc{>Ctf>y$TI`mb2(-)DrpRn%FMt zxFohF+8$Lki=|)30OFKL%Ze00z2LJ;7{~VXE5sAY(-ayRd{svS8tJ=LP00%7#gx(! zLYNt8I?gDT5gie+glTazhOO88W|8twDE0c4O+FKqH+0;@xR+?5XztOu{RAoZFdOAK zOh+(vqVb*z9oI3+2HG3jC!6f&;b7R#ORG%AtB$$(YT4ZNdlOx?_c<|(1?gU+jMj*Z z2+Kw|PGArLk;+v-gt=cHm=jou2njSCfA zFwzzD9kc7CIuKJMRwEfTlTAC(gsI`hSF^-1$O?$cI4*M~T;p!$AWyGg$j_YNSG+>T zXAFPjA^<6b7uxer5kl1>B#^8VY#h`CU#uI&wJUVzCkUs?Z!1e?_4uy;0JW> zhrgqP?p(;Gf{C}jJ@1 literal 0 HcmV?d00001 diff --git a/bin/td5/p1/arme/Bouclier.class b/bin/td5/p1/arme/Bouclier.class new file mode 100644 index 0000000000000000000000000000000000000000..c0fabd7e10d5dc1a34100e1d7ab030a15c7fdf74 GIT binary patch literal 457 zcmZvYO-sW-5Qg7P(tI_wG4{i&w^+g8p?IhWRS*inOQrX1y4004k(l_uJQY0n1N>3q zY;2&Ym)ZGv=b730{CfWYaEW6J8bhyKjicv_h!-0X-Q-o0N>Nxa82tUpl*$a|mCR&$ z&7g;;3kKshUkMuygWYtxU}$@2!DHx$@e_aLQOdJ*G%pL8ttYCj8_P`GSDU3M9{4gP zZV=}QPZzw9D&8fH@=?Ap4C4JgnmH2}Is!H5h+!DcX8(_3nS%e>g2A2VRgs80sm6C2 z>bX+lg#Mt@i2#kf7EH1hMdLaKtWjWZ;l9;^4q2B9Ael+B1M)m-AQ`&w=~W1oQHUvw jTI-B#zjwC9;ctiw8|@l0_z~_PfP)_TgrSQNNW<_O4NFuy literal 0 HcmV?d00001 diff --git a/bin/td5/p1/arme/Dague.class b/bin/td5/p1/arme/Dague.class new file mode 100644 index 0000000000000000000000000000000000000000..db3b43c12f9fee2d6dd0f0c82fe24bdf62577d81 GIT binary patch literal 446 zcmZvY%TB^T6o&r;rG=qNxw~~&F|lz$TwqMR#Dt`AgJC~FQ^%Cnl-BohMdHE-@S%)n zMixZfoH>{OeE-ROe!YJHxWJKv3ZY%B#=*;ZAoFz;+{w6%99RTzzkSU!f_hwR-Daz(js~G-)&vMm7d5zqz8^lzR~aNSje}W{t2CbIomQyQ=%HLMqWn=V5{7od zY$=nu%$2TpO{;iP8$vhSKf;(y1ghw0mo8!GPpAL;P^!s)P9TU`R_4p-UTJS(kY`$k zW4^x1-vU%PtHI{za5XkH;EX!;EySA<9B>po0LyHa9dhRK0?W{X$FD}{jz-+TGFmb6 fdY(AlqWzm9&_L5r20zLjMZ5ISXAWV&qzZ=LMgdO= literal 0 HcmV?d00001 diff --git a/bin/td5/p1/arme/Epée.class b/bin/td5/p1/arme/Epée.class new file mode 100644 index 0000000000000000000000000000000000000000..a7d8b34e4a3f78f8f225ec9b2bb658a256f39464 GIT binary patch literal 445 zcmZvYPfx-?5XIlnmbME@DFS-*hM3rRARaI##Arg&c)@UApusiJl3M&u9zBtG@Z!x6 zWt?3(5cM)Uf8PAwWIw;&-T_?T&_#(*FJ`@HbsoulnM60MkC()SO$c_|1D+Aemnv1o z6~XG9j0yI2HcLGC1jnoi5GqwTs1ll;_)$K~Xd%;iG%9kH&ii_&7OOP5TQ4U`elI5r zhK6xAm5Z^=m9Doy#&Ac#@6&Zo(((%!-# z&$JB3e7(ir0+cv&Q0C}z)iX8Vc0+Fi@oEHn90d=+vNFr|Ijiyl%TPnWuSV#OMhsvZ it=|ofyweTpzaau1DhAT}5pE%Xj{`IrLufImg!VV-L{WDD literal 0 HcmV?d00001 diff --git a/bin/td5/p1/arme/Fusil.class b/bin/td5/p1/arme/Fusil.class new file mode 100644 index 0000000000000000000000000000000000000000..b0a55e5c60f3051279b05c1615e4d4618e0b9ee3 GIT binary patch literal 445 zcmZvY&rZTX5XQfuEp3-7Py{@gctcEVJP;2U6JkO_(s;peU!cJ?rI^zCUYZ hzj0Tayz-7(Jb2cP3$QC0x~rv#5~lE*Vh)C9ulHbyvb}G#Etj(wk|*Kr%BHS z!z#*OVDads0)D&CwT?jH zV&JM0@+exE!K}bs)AQB(Xt1fGtCC=3&4SYFNZE)C^Ra{I=YZPG9;xr+s%AtAT|DEHYy-iUsyJ6SEgMt;qA^b{r`=Xc#!o zUpW;R)7ZN(^7^idG?-)IEu5e-1X~XVX@&pyXNB+Jq=9$;OCrf-;S^2_7+bPGQX4k~ zj#g793DJ$s+bpb6o4O)1Qees@ysvxW47pE-WcFG|(>rV7oTiuG^4LX7_`t%4IIsV0 z7%JZtIKETpGiX`C4HFjyEL+;THNGD`zHgiOi0xF@xj(kBs4 z>wVWfSNRD){EDN0VCj15R)2`MAK<<8&=_O6e1Qwy>**)Cy2Sk$D`TuJR>oM*5|lq< zVCGrAN*CHXf}I8{f0ssT;PU2nq!uMlLBMf0xmu{Oc$?+lVDS=r t@FU8&$M@-P%B01zQyI3!dXkA%!EbP(DCJFh@$vo#_o$jckH;KtJq126UCsai literal 0 HcmV?d00001 diff --git a/bin/td5/p1/etat/Mort.class b/bin/td5/p1/etat/Mort.class new file mode 100644 index 0000000000000000000000000000000000000000..401ee9938eecb6b787ab8b95933e04701918ed74 GIT binary patch literal 426 zcmZvYy-ve06otl}OVyGC3x*#zHRH>-Dn_6H9apby{cq}F)1|EQi zLcIc_mtRkgv+2s^9~e_d!|mlgZ5hZZyVLu*!#>yAZhj2i=f PvPMvipc=7XJ?tz2RvS=8 literal 0 HcmV?d00001 diff --git a/bin/td5/p1/etat/PlayerState.class b/bin/td5/p1/etat/PlayerState.class new file mode 100644 index 0000000000000000000000000000000000000000..8f68878c1a34dcd6b190db07abfb299570570be2 GIT binary patch literal 1160 zcmaKr;Z74l6ot>UrQ4P*tpy5|0#>P%qO7RZ9~u*5(ntb=!8H1Fx=hMKZJV-?_%NCn zpTHlY(ZmPvp^Rsy+od2O&2DCH@BPlbXJ-HW{rMZfV?44D5t#A!YEEz6QNHw@owod- z`ny~z3o(K0fjp5;TXtH`cJn~FzCgTZas(DOgUX)jA9Xt&*;39ok z*QG~69iO+cpyNps-|F`L6mHaaGQpYp2mPzMnzka z(B!I(RooFs94X)QOqtN!|3=lmrkUm*ZpohU$AUxOMm2`Btf6Az{)Imq-ihpRq;*ti z$!_>$R{1eI+}kD${bIvt?ReF!GrW|eMcs(OmWkH}Piq5O{1FP~yXD?~?T zpQTd;GUg239@H5oaM$FDNs99l2Jp85d|tz|g)hkK#V4b(rd94;qOw5xB8ogKZO=eu u{=7<&VSWLD%IiSIz_W$V2EVTH4=%wk@$kwtXn6#mKaZa#_#w3;sQm*3O}}dZ literal 0 HcmV?d00001 diff --git a/bin/td5/p1/etat/Vivant.class b/bin/td5/p1/etat/Vivant.class new file mode 100644 index 0000000000000000000000000000000000000000..16b0a6e260875a87c9fcdbdbee9db77f021deef2 GIT binary patch literal 1470 zcmaJ>ZIjbf6n<{IY|;`~=>m(oV%8UEcHNDrfKou-Tv;i*)nWnP?>3hjXp@*GJA;40 z8NT}q96pLnadgHnjC}AnF^tdMdfDWE2MEQ+LL&G9D=R zJdZ{dFXANw^8(Km>9%ba4&!A3lPOlixXWtGb!SZnELeC&oA%Juio-;86F&?pcnwDk zyv|g&<(72&GU&POyTe2cEF49h@nM<>9B5`{KXhBMA0+K0R&vlVu*e@b5tz`}yO8>Q zPsO_EH!Lh;g?%9CdN|1I`L93gc@u9LIQDN6SuP82;~fEGOZHQ>aZBJxJ!g^;-PpX% zG8)c=ip)rXDIJ{96L6B;CqoLm)6w+avv5k&D{uLn83(5=oB;=IT1JryJb~q%LjQ+W z6x=XzPQbFItq0+|^znV$#03t|iq3t>!Ur15Ov0Q)6(3^Fz-58i9eQiwBh7tRq}#2z zHZ5GmdOjVOh_)8%~1p`+U~NMC0I?8_|^H<@Qa z)B4=P7aHBj(EEXjuLMdf#P~+wkR2Q)O6(79nRe5__8#Bw$z-U1vsVxkYaBGLZ}-ks z85J8=ZHFl*a@E&6xI5qc6g#4N=2&%`HQ&HK{D2znQTr#mqkClM)o=Ic dNztQO`~rzhcCbq?-q25RPn=-uJc=c#e*j*!SKR;r literal 0 HcmV?d00001 diff --git a/bin/td5/p1/personnage/Humain.class b/bin/td5/p1/personnage/Humain.class new file mode 100644 index 0000000000000000000000000000000000000000..3ca4023c734ca646e695b1add4572acb1538f204 GIT binary patch literal 818 zcmZuu&1(};5dTd+cAL#=O-$0XR&A}?WGgNniib!+O2tDEp%Uq>ujwPMB)eg=DfCbB zrl1BCym<4E5@+@;O<}#fH}htGA2aXI-ygpKJjbq$0->Fp@B7nd{#3`aC=As|`>*E{ z6@)fQgw1^Q?NuXTMPKT}XdK0adjF%kQ2tnjBmX#wgK*R%STBMwNDc_aPIo{k9Y*Kc z0io)`hD+G(3dn_d%f*E0>pZ9I1>NzN) zF7met&Hu=E2V$`4q9q;GnNE(f8Ev!)wTxKB6YU>Oe}Ce6*03RjD?+{L;x6tHDhzzD z)ierInd_*R4DHEG#5EeS$Y?1-Xmq;y6;#;MLlINRqc@ojrV3pigmEZ_#84&QQGsNyC^u4%(6ZgD0Q@*)(cOd%32 zZ*PH`_vAYo-cPKZEU>=7oh4(PrNLZf=5Uy$iCW6MWzZQj^WZ+Kim4X1I4W?wjR%>U z&$rad-dF5==D^rBfW|eeB4e!bw`Jf1?v}AEZ|@s+me$O$ZML?aGPF$Bl_e|Pod`cl H6(9ct?<|jd literal 0 HcmV?d00001 diff --git a/bin/td5/p1/personnage/Orc.class b/bin/td5/p1/personnage/Orc.class new file mode 100644 index 0000000000000000000000000000000000000000..0a536ee7b85764ea61db7197bf58093b32f3891d GIT binary patch literal 783 zcmZuuO=}ZT6g@AQ%rw){n%JbNjaomd$p{WEii=1=q(UI55Q(_+HGRa9bS6xuF8oJ= z8$k^yxN+x?63?9(+d$mBckjFRo{#%}|M~tCz(aH$loT52@qRFS5X?+6kE2LWOz=Dz zJFpbmtECrbT?&rT$uRt26jWcqeiTMwdZ1A5bVmx-lla)UP+0fiz*A^;2JiHH9ZYpJ z35IDBMw4D&IyVMkWS*U#9GT>$KAIA)K8VM9I?_ofdGTnaZ^OC5)?if>_4ZtpQ5UMq zwDcdU?nuNmJT$ST;Lc5Y_)opnp$-Sz3bg`TCnqL2oc;Pp2QBOf?3xf<^>7W>6{;M6 zW%MkLGP32V#~kg6EyY@W)iMio=uVdSxv+kf;_i5;z-Dn6pC)7TG?ZPe(cFDm9B#0s z%#TwjNgpGNF_rPGGTUcW@pgPwUcmj#u!IXdUEXrqSjR<1UfzZcTw*2=@*)s#2q6?r z|K0*Mzx@rH{tvWXFK}gn_Bmpm)F4)c7%ov7sAb5z`E-Fy9PDPYCAvxe5_xXncEJ|# z7Qq$&3-&%S$mQDEZBrX%6g>}wO$ckj@KQ0c4OVNim@c#;)zrQP+t5ZpgQ@5j7qUWXvdJt9j{nII zI#a@oo$&|wqdK0uS(0=&_~qGs_PO`mbI!fb{`=!j(Gjx3jCq=F^O@!F9ol}ks(qb(AQ9FoLY{TL>kv5;=008?*Gy9wMhzC(lG^H zq}wZEvgHl212ve1e?VW_x9NAIoiuC`EfU%k!**U%BD;$wS-Quv+Y*K;F_Z z0gWdXJv?nt^IR?;wI_}{3RlA|e0{Qa)(rwP{j!lbzxABbWVLTXq-M^M`pXZT=bGdJ7@}bY3w+aiVYrI- zxD$xE0ODuAD3CGEv1q(TdXFz3oFQv0ck!VyQ}5#A0qz3n0V(F_M4rVwanf9+#)4ln z6VxCg@|3`lhJourwKc{GGc|zJcm&)Wg5ZSvG==Cg-vr`Q7ZgH--SG`hZg~>4^ZYV08#kC@j9l?Y-1z=lI;{V!exE>OmKey4d)Whhr28KNTqW z&^=2R`<6cK1DbvTV1fk8;p96*$rJr#{zL*c_gPBhX~yyy$^)Bv%GT-s-63UKUzz3) zj40!k53q)b6#fXQD2^n;Usr@k`V56Ikq0F5@Dd_2!9s-hX#|l<*pbpmB3syw5TPTL zFp;MuQoe+UTpb~@gKr~5y7(?klJ{s#m`KU@F+ literal 0 HcmV?d00001 diff --git a/bin/td5/p1/personnage/Tauren.class b/bin/td5/p1/personnage/Tauren.class new file mode 100644 index 0000000000000000000000000000000000000000..a84f184e8aec9a4e565daab7fb5efd3c97264961 GIT binary patch literal 798 zcmZvZ-)a*<6vn@kY<8Q?YHgatw2fN-v`toU@uGMUDX1U@f(R)Q@0_MXx{}U@&88PV zlQ)7IQ1AhKDDj-#B@M)znKLuzeBbY!`SbVZZvfBGaZn&Mlk?+X`ZSp8corF>#yU7v z^H>`P7NNEN`fiy>*tm#dGYCIx0`&;?^U#FJ38C2T3<=h&=v=!XR6IEF2#t3Cle$vD zM453gNaE0pyFJO=?1x6bonM~m_*9)uSgzWSMrtxtaVY2f(n>DE8DY1-PL(ltT@+Cj zw{1fGKW?3&@YFptaGSYiI(f6~z-lv#gB?OG*H`hS4qis{(InKdizfC&dP7X^c({vu zgfdIK*J>J>)Nr-%1y^^aJL0$MdguHwVutZ50}rlOX2L@cCD;Ua5Y6L}ejUn8Dp`|H zWQMrUSw;RwLP1hFvN&csUdwzs=2zm~@u|3g`<252Zt&{zE~||SZgS*hY1qUqK8b|f zh{Q*h5Q~QYc!4dy^#e8k7n&ay*j=D?typDiuvUpRTvn-LD^=dls&i%5!G4M@(F67` zu+Kw0%H0Cq1-RsY!@(C0GF&^otgWDmO@_*!m=~XLwzOsYd*5+zjg~drWVD@Bp^;@R Ok?eGKVtkZ3w*LX5GldZV literal 0 HcmV?d00001 diff --git a/bin/td5/p1/personnage/Troll.class b/bin/td5/p1/personnage/Troll.class new file mode 100644 index 0000000000000000000000000000000000000000..164fec8af4ecd6d5819c11facfcf474bdd3be713 GIT binary patch literal 830 zcmZuu+iuf95IvKNOaiB#oI#a<&#lGbEVTKO9mrh7H5#*$_m2{x+3OeoqQ>raY*b+otRr5)nLhO8JFIlR=duKBaZ{Q1 zOejewM-`6Q9iKJM_PI)Yn-0+&))x*-Smx8>TTTN@xXY29wP6LToC$@z2*oK=h(z1j zo1^YL`;Mmb6P=Sex^vvWWo)oCn5)Vh7PGWaPnkC}bk58?c*Lq=s*O#KN*r(Dajxd_ zEw!ri72DSwWOg$^bHS>}WL9~9IrxCPWh}$l`-bgXYuT{tY^|Fzw6m@oOGf&4BK#y( GeEJun(Uckh literal 0 HcmV?d00001 diff --git a/bin/td5/p1/td5p1.png b/bin/td5/p1/td5p1.png new file mode 100644 index 0000000000000000000000000000000000000000..b863fc4782ae164f5ee26261557b62ae4c4f2270 GIT binary patch literal 88597 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 Ai~s-t literal 0 HcmV?d00001 diff --git a/src/Diagramme_de_classe_forum.ucls b/src/Diagramme_de_classe_forum.ucls new file mode 100755 index 0000000..395f71b --- /dev/null +++ b/src/Diagramme_de_classe_forum.ucls @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/designPattern/facebookGhost/Event.java b/src/designPattern/facebookGhost/Event.java new file mode 100644 index 0000000..9d8e17d --- /dev/null +++ b/src/designPattern/facebookGhost/Event.java @@ -0,0 +1,5 @@ +package designPattern.facebookGhost; + +public interface Event { + +} diff --git a/src/designPattern/facebookGhost/FacebookGhostNetwork.java b/src/designPattern/facebookGhost/FacebookGhostNetwork.java new file mode 100644 index 0000000..eea1e33 --- /dev/null +++ b/src/designPattern/facebookGhost/FacebookGhostNetwork.java @@ -0,0 +1,125 @@ +package designPattern.facebookGhost; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Observable; + + +/** + * + * Inspired by + * //https://github.com/roundrop/facebook4j/blob/master/facebook4j-core/src/main/java/facebook4j/api/FriendMethods.java + * pour imaginer une esquisse de rseau tr�s tr�s simplifi� + * @author blay + * + */ +@SuppressWarnings("deprecation") +public class FacebookGhostNetwork extends Observable { + + public static final String DEFAULT_LOCATION = "unspecified"; + HashMap users = new HashMap<> (); + + public FacebookGhostNetwork() { + } + + + public User addUser(String nom, String profile){ + return addUser(nom, profile,DEFAULT_LOCATION); + } + + public User addUser(String nom, String profile, String location){ + User user = new UserImpl(nom, profile,location); + users.put(nom, user); + Event e = new UserEvent(user); + setChanged(); + notifyObservers(e); + return user; + } + + /** + * Returns a user's friends. + * @param userId the ID of a user + * @return users + * @see User#friends - Facebook Developers + */ + ArrayList getFriends(String userId){ + return getUser(userId).getFriends(); + } + + + /** + * Returns a user's family members. + * @param userId the ID of a user + * @return users + * @see User#friends - Facebook Developers + */ + ArrayList getFamily(String userId){ + return getUser(userId).getFamily(); + } + + + + /** + * Returns a given user, specified by ID. + * @param userId the ID of the user + * @return user + * remove but not the use of dedicated exception !! @throws FacebookException when Facebook service or network is unavailable + * @see User - Facebook Developers + */ + public User getUser(String userId) { + return users.get(userId); + } + + + /** + * Create a relation between 2 given members of a same family + * @param id1 the ID of the user + * @param id2 the ID of the user + */ + public void addFamilyRelation(String id1, String id2) { + User u1 = users.get(id1); + User u2 = users.get(id2); + addFamilyRelation(u1, u2); + + } + + + public void addFamilyRelation(User u1, User u2) { + u1.addFamily(u2); + u2.addFamily(u1); + Event e = new RelationEvent("family",u1,u2); + setChanged(); + notifyObservers(e); + + } + + + + /** + * Create a relation between 2 given friends + * @param id1 the ID of the user + * @param id2 the ID of the user + */ + public void addFriendRelation(String id1, String id2) { + User u1 = users.get(id1); + User u2 = users.get(id2); + addFriendRelation(u1, u2); + } + + public void addFriendRelation(User u1, User u2) { + u1.addFriend(u2); + u2.addFriend(u1); + Event e = new RelationEvent("Friend",u1,u2); + setChanged(); + notifyObservers(e); + + } + @Override + public String toString() { + return "FacebookGhostNetwork [ " + users + "]"; + } + + + + +} diff --git a/src/designPattern/facebookGhost/IdNameEntity.java b/src/designPattern/facebookGhost/IdNameEntity.java new file mode 100644 index 0000000..71b77e0 --- /dev/null +++ b/src/designPattern/facebookGhost/IdNameEntity.java @@ -0,0 +1,6 @@ +package designPattern.facebookGhost; + +public interface IdNameEntity { + String getId(); + String getName(); +} diff --git a/src/designPattern/facebookGhost/IdNameEntityImpl.java b/src/designPattern/facebookGhost/IdNameEntityImpl.java new file mode 100644 index 0000000..62eaab6 --- /dev/null +++ b/src/designPattern/facebookGhost/IdNameEntityImpl.java @@ -0,0 +1,25 @@ +package designPattern.facebookGhost; + +public class IdNameEntityImpl implements IdNameEntity { + + private String id; + private String name; + + @Override + public String getId() { + return id; + } + + @Override + public String getName() { + return name; + } + + public IdNameEntityImpl(String id, String name) { + super(); + this.id = id; + this.name = name; + } + + +} diff --git a/src/designPattern/facebookGhost/RelationEvent.java b/src/designPattern/facebookGhost/RelationEvent.java new file mode 100644 index 0000000..27307f2 --- /dev/null +++ b/src/designPattern/facebookGhost/RelationEvent.java @@ -0,0 +1,32 @@ +package designPattern.facebookGhost; + +public class RelationEvent implements Event { + public String getNature() { + return nature; + } + + public User getU1() { + return u1; + } + + public User getU2() { + return u2; + } + + String nature; + User u1; + User u2; + + public RelationEvent(String nature, User u1, User u2) { + this.nature = nature; + this.u1 = u1; + this.u2=u2; + } + + @Override + public String toString() { + return "RelationEvent [nature=" + nature + ", u1=" + u1 + ", u2=" + u2 + + "]"; + } + +} diff --git a/src/designPattern/facebookGhost/User.java b/src/designPattern/facebookGhost/User.java new file mode 100644 index 0000000..39b97c6 --- /dev/null +++ b/src/designPattern/facebookGhost/User.java @@ -0,0 +1,104 @@ +package designPattern.facebookGhost; + +/*import java.net.URL; + +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Set;*/ + +import java.util.ArrayList; + +/** + * Emprunt� � https://github.com/roundrop/facebook4j + * @author Ryuji Yamashita - roundrop at gmail.com + */ +public interface User { + + String myProfil(); + String getId(); + String getName(); + /* String getFirstName(); + String getMiddleName(); + String getLastName(); + String getGender(); + Locale getLocale(); + List getLanguages(); + URL getLink(); + String getUsername(); + String getThirdPartyId(); + Boolean isInstalled(); + Double getTimezone(); + Date getUpdatedTime(); + Boolean isVerified(); + String getBio(); + String getBirthday(); +// Cover getCover(); + List getEducation(); + String getEmail(); + */ + IdNameEntity getHometown(); + /* + List getInterestedIn(); + IdNameEntity getLocation(); + String getPolitical(); + List getFavoriteAthletes(); + List getFavoriteTeams(); +// Picture getPicture(); + String getQuotes(); + String getRelationshipStatus(); + String getReligion(); + IdNameEntity getSignificantOther(); + User.VideoUploadLimits getVideoUploadLimits(); + URL getWebsite(); + List getWork(); +; + + interface Education { + IdNameEntity getYear(); + String getType(); + IdNameEntity getSchool(); + IdNameEntity getDegree(); + List getConcentration(); + List getClasses(); + List getWith(); + } + + interface EducationClass { + List getWith(); + String getDescription(); + } + + interface VideoUploadLimits { + long getLength(); + long getSize(); + } + + interface Work { + IdNameEntity getEmployer(); + IdNameEntity getLocation(); + IdNameEntity getPosition(); + String getStartDate(); + String getEndDate(); + + }*/ + + User.AgeRange getAgeRange(); + interface AgeRange { + // one value could be null (13-17 / 18-20 / 21 - null) + Integer getMin(); + Integer getMax(); + int getAge(); + } + ArrayList getFriends(); + void addFriend(User friend); + void addFamily(User familyMember); + ArrayList getFamily(); + + void setLocation(String name); + //String BIRTHDAY_DATE_FORMAT = "MM/dd/yyyy"; + + + + +} \ No newline at end of file diff --git a/src/designPattern/facebookGhost/UserEvent.java b/src/designPattern/facebookGhost/UserEvent.java new file mode 100644 index 0000000..424f8ff --- /dev/null +++ b/src/designPattern/facebookGhost/UserEvent.java @@ -0,0 +1,11 @@ +package designPattern.facebookGhost; + +public class UserEvent implements Event { + + User user; + + public UserEvent(User user) { + this.user = user; + } + +} diff --git a/src/designPattern/facebookGhost/UserImpl.java b/src/designPattern/facebookGhost/UserImpl.java new file mode 100644 index 0000000..db222c6 --- /dev/null +++ b/src/designPattern/facebookGhost/UserImpl.java @@ -0,0 +1,105 @@ +package designPattern.facebookGhost; + +import java.util.ArrayList; + + +public class UserImpl implements User { + + + private String id; + private String myProfile; + private User.AgeRange range; + private IdNameEntity homeTown; + + + class AgeRangeImpl implements User.AgeRange{ + + int age = 20; + public Integer getMin() { + return 0; + } + + public Integer getMax() { + return 120; + } + + public int getAge() { + return age; + } + + } + + + public UserImpl(String id, String profile, String phomeTown) { + this.id = id; + myProfile = profile; + range = new AgeRangeImpl(); + homeTown = new IdNameEntityImpl(phomeTown,phomeTown); + } + + + public UserImpl(String id, String profile) { + this.id = id; + myProfile = profile; + range = new AgeRangeImpl(); + } + + public String myProfil() { + return myProfile; + } + + public String getId() { + return id; + } + + public String getName() { + return id; + } + + public AgeRange getAgeRange() { + return range; + } + + + + private ArrayList friends = new ArrayList (); + + public void addFriend(User friend) { + friends.add(friend); + } + + public ArrayList getFriends() { + return friends; + } + + private ArrayList family = new ArrayList (); + + public void addFamily(User familyMember) { + family.add(familyMember); + } + + public ArrayList getFamily(){ + return family; + } + + @Override + public String toString() { + return "UserImpl [id=" + id + ", myProfile=" + myProfile + ", range=" + + range + + //",friends=" + friends + ", family=" + family + + "]"; + } + + @Override + public IdNameEntity getHometown() { + return homeTown; + } + + + @Override + public void setLocation(String name) { + homeTown = new IdNameEntityImpl(name,name) ; + } + + +} diff --git a/src/designPattern/grapheSimple/Chemin.java b/src/designPattern/grapheSimple/Chemin.java new file mode 100644 index 0000000..527f79a --- /dev/null +++ b/src/designPattern/grapheSimple/Chemin.java @@ -0,0 +1,192 @@ +package designPattern.grapheSimple; + +import designPattern.grapheX.*; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * La classe Chemin définit un chemin comme un ensemble d'arcs et maintient pour + * chaque chemin la somme des valeurs des arcs + * + * @author blay + * @param + * + */ +public class Chemin implements Comparable> { + + // On pourrait éviter cet attribut en calculant la distance à la demande. + int distance = 0; + + List> paths = new ArrayList<>(); + + public Chemin() { + paths = new ArrayList<>(); + } + + public Chemin(List> arcs) { + paths = arcs; + } + + /** + * @return le Sommet terminant le chemin si le chemin est vide il vaut null + */ + public S arrivee() { + if (paths.isEmpty()) + return null; + Arc arc = paths.get(paths.size() - 1); + return arc.destination(); + } + + /** + * @return la somme des valeurs des arcs + */ + public int distance() { + return distance; + } + + /** + * @return la liste des arcs qui composent le chemin Attention dangereux une + * copie serait préférable + */ + public List> getArcs() { + return paths; + } + + /** + * Ajoute un arc � la fin du chemin + * + * @TODO : verifier que le dernier noeud est bien le premier noeud de l'arc + * ajoute + */ + public boolean add(Arc e) { + distance += e.valeur(); + return paths.add(e); + } + + public void add(int x, Arc e) { + distance += e.valeur(); + paths.add(x, e); + } + + public boolean addAll(Collection> c) { + for (Arc a : c) + distance += a.valeur(); + return paths.addAll(c); + } + + public void clear() { + distance = 0; + paths.clear(); + + } + + /** + * verifie l'appartenance d'un arc au chemin + * + * @param arc + * @return vrai si l'arc appartient au chemin + */ + public boolean contains(Arc arc) { + return paths.contains(arc); + } + + public boolean isEmpty() { + return paths.isEmpty(); + } + + public boolean remove(Arc o) { + return paths.remove(o); + } + + public boolean removeAll(Collection> c) { + return paths.removeAll(c); + } + + public int size() { + return paths.size(); + } + + @Override + public String toString() { + return "Chemin [dist.=" + distance + ", paths=" + paths + "]"; + } + + /** + * d�termine si le sommet appartient au chemin + * + * @param sommet + * @return vrai si le sommet appartient au chemin + */ + public boolean atteint(S sommet) { + for (Arc a : paths) + if (a.destination().equals(sommet)) + return true; + return false; + } + + /** + * @param depart + * @param arrivee + * @return le sous-chemin reliant depart et arrivee si les deux noeuds + * appartiennent au chemin. + * + */ + public Chemin extraireChemin(S depart, S arrivee) { + boolean debutee = false; + Chemin c = new Chemin<>(); + for (Arc a : paths) { + if (debutee) { + c.add(a); + } + if (a.origine().equals(depart)) { + c.add(a); + debutee = true; + } + if (debutee && a.destination().equals(arrivee)) + return c; + } + return c; + + } + + public int compareTo(Chemin c) { + if (this.distance() < c.distance()) + return -1; + else if (this.distance() == c.distance()) + return 0; + else + return 1; + + } + + public boolean equals(Object o) { + if (!(o instanceof Chemin)) + return false; + + Chemin o2 = (Chemin) o; + Chemin c = o2; + if ((distance == c.distance) && (c.paths.size() == this.paths.size())) { + for (Arc a : c.paths) { + if (!paths.contains(a)) { + return false; + } + } + return true; + } else + return false; + + } + + public List sommets() { + List sommets = new ArrayList<>(); + if (! paths.isEmpty()) { + for (Arc arc : paths) + sommets.add(arc.origine()); + sommets.add(paths.get(paths.size() - 1).destination()); + } + return sommets; + } + +} diff --git a/src/designPattern/grapheSimple/GrapheSimple.java b/src/designPattern/grapheSimple/GrapheSimple.java new file mode 100644 index 0000000..c86d0cd --- /dev/null +++ b/src/designPattern/grapheSimple/GrapheSimple.java @@ -0,0 +1,260 @@ +package designPattern.grapheSimple; + +import designPattern.grapheX.*; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +/** + * Cette classe a ete necessaire pour gérer les graphes ayant plusieurs arétes entre deux sommets données + * et ayant des arcs dans les deux sens entre deux sommets. + * Ces fonctionnalités n'étaient pas prises en charge par les classes initiales. + * Elle permet egalement de simplifier la comprehension des codes données. + * @author blay + * + */ +public class GrapheSimple extends Graphe { + HashMap mesSommets = new HashMap<>(); + + HashMap>>> aretes; + + + public GrapheSimple() { + aretes = new HashMap<>(); + } + + + public T getSommet(String ident){ + return mesSommets.get(ident); + } + + @Override + public int taille() { + return mesSommets.size(); + } + + + @Override + + public Graphe copie() { + //@TODO + return null; + } + + //n'ajoute le sommet que s'il n'est pas deja dans le graphe. + @Override + public void ajouterSommet(T s) { + if (existeSommet(s)) + return; + mesSommets.put(s.identifiant(), s); + aretes.put(s,new HashMap>>()); + } + + @Override + public boolean existeArc(Sommet s, Sommet t) { + return aretes.get(s).containsKey(t); + } + + + //A revoir avec la nouvelle version + //@todo + private boolean existeSommet(T s) { + return aretes.containsKey(s); + } + + + public List> arcs(T s, T t) { + return aretes.get(s).get(t); + } + + @Override + public void ajouterArc(T s, T t) { + this.ajouterArc(s,t,0); + } + + + @Override + public void ajouterArc(Arc arc) { + HashMap>> s = aretes.get(arc.origine()); + if (s == null){ + ajouterSommet(arc.origine()); + s=aretes.get(arc.origine()); + } + if (aretes.get(arc.destination()) == null) + ajouterSommet(arc.destination()); + if (s.get(arc.destination()) == null) + s.put(arc.destination(), new ArrayList<>()); + s.get(arc.destination()).add(arc); + + } + @Override + public void ajouterArc(T s, T t, int val) { + Arc a = new Arc<>(s,t,val); + this.ajouterArc(a); + } + + //Remarque : gestion horrible des exceptions mais on s'adapte à cause de l'héritage qui nous interdit de lever une exception. + @Override + public int valeurArc(T s, T t) { + if (!existeArc(s,t)) throw new Error("Arc inexistant"); + return aretes.get(s).get(t).get(0).valeur(); + } + + //RETIRE TOUS LES ARCS VERS T + @Override + public void enleverArc(Sommet s, Sommet t) { + if (!existeArc(s,t)) return ; + aretes.get(s).remove(t); + } + + @Override + public Collection sommets() { + return mesSommets.values(); + } + + @Override + public Collection> voisins(Sommet s) { + ArrayList> voisins = new ArrayList<>(); + HashMap>> arcs = aretes.get(s); + if ( arcs != null ) + for (ArrayList> av : arcs.values()) + voisins.addAll(av); + return voisins ; + } + + @Override + public String toString() { + return "Sommets=" + mesSommets + ";\n arcs=" + + toStringArretes(aretes) + "]"; + } + + private String toStringArretes( + HashMap>>> aretes2) { + StringBuilder bld = new StringBuilder(); + for ( HashMap>> x : aretes2.values()){ + for ( ArrayList> edges : x.values()) + for (Arc a : edges) + bld.append( "\t").append(a).append("\n" ); + } + return bld.toString(); + } + + + /** + * @param origine + * @return une liste de chemin + * Cette m�thode renvoie les chemins les plus longs possibles � partir du point d'orgine + */ + public List> chemins(T origine){ + HashMap>> dejaVu = new HashMap<>(); + return chemins(origine,dejaVu); + } + + /** + * @param origine + * @param destination + * @return une liste de chemins entre deux Ts + * Cette m�thode renvoie tous les chemins entre deux Sommets donnes + */ + //Pbme avec la comparaison des chemins... qui considere comme �gal deux objets diff�rents... cela doit venir de l'h�ritage... + + public List> chemins(T origine, T destination){ + List> chemins = chemins(origine); + List> cheminsEntreDeuxSommets = new ArrayList<> (); + for(Chemin c : chemins) { + if (c.atteint(destination)){ + Chemin raccourcis = c.extraireChemin(origine, destination); + if (! cheminsEntreDeuxSommets.contains(raccourcis)) { + cheminsEntreDeuxSommets.add(raccourcis); + } + } + } + return cheminsEntreDeuxSommets; + } + + + private List> chemins(T origine, HashMap>> dejaVu){ + + List> chemins = new ArrayList<>(); + + if (dejaVu.containsKey(origine)){ + chemins.add(new Chemin<>(dejaVu.get(origine))); + return chemins; + } + + + dejaVu.put(origine, new ArrayList>()); + + + Collection> voisins = voisins(origine); + HashMap>> dejavVuLocal ; + + for (Arc a : voisins) { + T destination = a.destination(); + dejavVuLocal= new HashMap<>(dejaVu); + + if (nouvelleDestinationOuNouvelArcSansRetour(origine,dejavVuLocal,destination,a)) { + dejavVuLocal.get(origine).add(a); + List> cheminsLocaux = chemins(destination,dejavVuLocal); + if (cheminsLocaux.isEmpty()) { + Chemin chemin = new Chemin<>(); + chemin.add(a); + chemins.add(chemin); + } + else { + for (Chemin c : cheminsLocaux) { + c.add(0,a); + chemins.add(c); + } + } + } + } + return chemins; + } + + //todo : tenir compte de Origine + private boolean nouvelleDestinationOuNouvelArcSansRetour( + T origine, HashMap>> dejaVu, T destination, + Arc a) { + + if (! dejaVu.containsKey(destination) ) + return true; + + return ( (! dejaVu.get(destination).contains(a)) && (! dejaVu.containsKey(a.destination()) ) ); + } + + + public Chemin cheminLePlusCourt(T origine, T destination){ + List> chemins = this.chemins(origine, destination); + Chemin cheminLePlusCourt = null; + int distanceLaPlusCourte = Integer.MAX_VALUE; + for(Chemin c : chemins) { + if (distanceLaPlusCourte > c.distance()) { + distanceLaPlusCourte = c.distance(); + cheminLePlusCourt = c; + } + } + return cheminLePlusCourt; + } + + public Set voisinsAuRang(T origine, int rang){ + List> chemins = chemins(origine); + Set TsVoisinsDejaVu = new TreeSet<>(); + Set TsDeBonRang = new TreeSet<>(); + for (Chemin c : chemins) { + List sommets = c.sommets(); + int i = 0; + for (i = 0; (i d avec valeur val +public class Arc implements Comparable> { + private S o, d; + + private int val; + + public Arc(S o0, S d0, int val0) { + this.o = o0; + this.d = d0; + this.val = val0; + } + + public Arc(S o0, S d0) { + this.o = o0; + this.d = d0; + this.val = 0; + } + + public Arc(Arc a) { + this.o = a.o; + this.d = a.d; + this.val = a.val; + } + + public S destination() { + return d; + } + + public S origine() { + return o; + } + + public int valeur() { + return val; + } + + public void modifierValeur(int vv) { + this.val = vv; + } + + @Override +public String toString() { + return "(" + val + ":" + this.o + ", " + this.d + ")"; + } + + @Override +public int hashCode() { + int codeOri = (o == null ? 0 : o.hashCode()); + int codeDst = (d == null ? 0 : d.hashCode()); + return codeDst ^ (codeOri * 31); + } + + @Override +public boolean equals(Object aa) { + if (!(aa instanceof Arc)) + return false; + Arc arc = (Arc) aa; + boolean equalsO = o == null && arc.o == null || o != null + && o.equals(arc.o); + boolean equalsD = d == null && arc.d == null || d != null + && d.equals(arc.d); + return equalsO && equalsD && (val == arc.val); + } + +public int compareTo(Arc a) { + int comp = Identifiable.compare(this.o, a.o); + if (comp == 0) + comp = Identifiable.compare(d, a.d); + return comp; + } + +} diff --git a/src/designPattern/grapheX/Graphe.java b/src/designPattern/grapheX/Graphe.java new file mode 100644 index 0000000..9481ecc --- /dev/null +++ b/src/designPattern/grapheX/Graphe.java @@ -0,0 +1,871 @@ +package designPattern.grapheX; + +import java.util.*; + +/** + Classe abstraite de graphes + + + @author FMorain (morain@lix.polytechnique.fr) + @version 2008.03.01 + @author MBF revisée pour la rendre générique + */ + +public abstract class Graphe extends GrapheGenerique{ + + @Override +public abstract int taille(); + public abstract Graphe copie(); + + @Override +public abstract void ajouterSommet(T s); + @Override +public abstract boolean existeArc(T s, T t); + @Override +public abstract void ajouterArc(T s, T t, int val); + public abstract void ajouterArc(Arc arc); + @Override +public abstract int valeurArc(T s, T t); + @Override +public abstract void enleverArc(T s, T t); + + @Override +public abstract Collection sommets(); + @Override +public abstract Collection> voisins(T s); + + public boolean oriente; + + public static String version(){ + return "grapheX -- version 1.3d, 2008/02/27"; + } + + public void ajouterArc(T s, T t){ + ajouterArc(s, t, 0); + } + + public boolean existeArc(Arc alpha){ + return existeArc(alpha.origine(), alpha.destination()); + } + + + +public String toString(){ + String str = ""; + + for(T s : sommets()){ + str += s + ":"; + for(T t : sommets()){ + if(existeArc(s, t)) + str += " " + valeurArc(s, t); + else + str += " -"; + } + str += "\n"; + } + return str; + } + + /* public void faireComplet(){ + int n = taille(); + for(int i = 0; i < n; i++) + ajouterSommet(new Sommet(i+"")); + for(Sommet s : sommets()) + for(Sommet t : sommets()) + if(!s.equals(t)) + ajouterArc(s, t, 1); + } + + public static void afficherParcours(HashMap L){ + System.err.println("PARCOURS"); + for(Sommet s : L.keySet()) + System.err.print(" ["+s+", "+L.get(s)+"]"); + System.err.println(); + } + + public static Graphe RoyWarshall(Graphe G){ + Graphe F = G.copie(); + + for(Sommet s : G.sommets()) + F.ajouterArc(s, s, 1); + System.err.println("FT_ini = \n"+F); + for(Sommet r : G.sommets()){ + for(Sommet s : G.sommets()) + for(Sommet t : G.sommets()) + if(!F.existeArc(s, t) + && (F.existeArc(s, r) && F.existeArc(r, t))) + F.ajouterArc(s, t, 1); + System.err.println("\nA_"+r); + System.err.println(F); + } + return F; + }*/ + + //////////////////// Dijkstra //////////////////// + + public HashMap Dijkstra(T s){ + int INFINITY = 1000000; + HashMap L = new HashMap(); + + // 1. initialisation + for(T t : sommets()) + if(! t.equals(s)) + if(existeArc(s, t)) + L.put(t, valeurArc(s, t)); + else + L.put(t, INFINITY); + // 2. + HashSet U = new HashSet<>(sommets()); // copie + L.put(s, 0); + U.remove(s); + // 3. + while(! U.isEmpty()){ + //afficherParcours(L); + // 4. + T v = null; + int Lv = INFINITY; + for(T t : U) + if(L.get(t) < Lv){ + v = t; + Lv = L.get(t); + } + System.err.println("-->v="+v); + // 5. + U.remove(v); + // 6. + // for(Sommet t : U) + // if(existeArc(v, t)){ + for(Arc a : voisins(v)){ + T t = a.destination(); + int tmp = Lv + a.valeur(); + if(tmp < L.get(t)) + L.put(t, tmp); + } + } + return L; + } +/* + TreeSet Dijkstra2Init(HashMap L, T s){ + int INFINITY = 1000000; + TreeSet fp = + new TreeSet( + new Comparator() { + public int compare(SommetValue s1, SommetValue s2) { + if(s1.valeur < s2.valeur) + return -1; + else if(s1.valeur > s2.valeur) + return 1; + if(s1.s.equals(s2.s)) + return 0; + return -1; + } + } + ); + for(Sommet u : sommets()){ + if(u.equals(s)) + L.put(u, 0); + else if(existeArc(s, u)){ + int val = valeurArc(s, u); + fp.add(new SommetValue(u, val)); + L.put(u, val); + } + else{ + fp.add(new SommetValue(u, INFINITY)); + L.put(u, INFINITY); + } + } + return fp; + } + + public HashMap Dijkstra2(T s){ + HashMap L = new HashMap(); + + // 1. initialisation + TreeSet U = Dijkstra2Init(L, s); + // 3. + while(! U.isEmpty()){ + //afficherParcours(L); + // 4. + SommetValue v = U.first(); + U.remove(v); + int Lv = v.valeur; + //System.err.println("v="+v.s+" Lv="+Lv); + // 5. + // 6. + for(Arc a : voisins(v.s)){ + Sommet t = a.destination(); + int tmp = Lv + a.valeur(); + if(tmp < L.get(t)){ + // System.err.println("-"+t+" "+L.get(t)); + U.remove(new SommetValue(t, L.get(t))); + // System.err.println("+"+t+" "+tmp); + U.add(new SommetValue(t, tmp)); + L.put(t, tmp); + } + } + } + return L; + } + + public void Prim(){ + HashSet HS = new HashSet(); + for(Sommet u : sommets()){ + if(! HS.contains(u)){ + //System.err.println("Je pars de "+u); + HS.add(u); + TreeSet> fp = + new TreeSet>( + new Comparator>(){ + public int compare(Arc a1, Arc a2){ + if(a1.valeur() < a2.valeur()) + return -1; + else if(a1.valeur() > a2.valeur()) + return 1; + else if(a1.equals(a2)) + return 0; + else if(! a1.origine().equals(a2.origine())) + return a1.origine().compareTo(a2.origine()); + else if(! a1.destination().equals(a2.destination())) + return a1.destination().compareTo(a2.destination()); + else + return 0; + } + } + ); + for(Arc a : voisins(u)){ + //System.err.println("fp += "+a+" ["+a.valeur()+"]"); + fp.add(a); + } + while(! fp.isEmpty()){ + System.err.println("FP_BEGIN"); + for(Arc z : fp){ + System.err.println(z+" "+z.valeur()); + } + System.err.println("FP_END"); + Arc a = fp.first(); + fp.remove(a); + Sommet t = a.destination(); + System.err.print("Je regarde "+a+"["+a.valeur()+"] : "); + if(HS.contains(t)) + System.err.println("il forme un cycle"); + else{ + System.err.println("je l'ajoute dans T"); + HS.add(t); + for(Arc b : voisins(t)){ + System.err.println("fp += "+b+" ["+b.valeur()+"]"); + fp.add(b); + } + } + } + } + } + } + + //////////////////// BFS //////////////////// + + + final static int inexplore = 0, encours = 1, explore = 2; + + public void bfs(HashMap etat, Sommet s){ + LinkedList f = new LinkedList(); + + etat.put(s, encours); + f.addLast(s); + while(! f.isEmpty()){ + Sommet t = f.removeFirst(); + System.err.println("J'explore "+t); + for(Arc a : voisins(t)){ + Sommet u = a.destination(); + if(etat.get(u) == inexplore){ + etat.put(u, encours); + f.addLast(u); + } + } + etat.put(t, explore); + } + } + + public HashMap bfsDistance(Sommet s){ + HashMap etat = new HashMap(); + LinkedList f = new LinkedList(); + HashMap distance = + new HashMap(); + HashMap numero = + new HashMap(); + int num = 0; + + for(Sommet t : sommets()){ + etat.put(t, inexplore); + distance.put(t, 0); + numero.put(t, 0); + } + etat.put(s, encours); + f.addLast(s); + numero.put(s, num++); + while(! f.isEmpty()){ + Sommet t = f.removeFirst(); + System.err.println("J'explore "+t); + for(Arc a : voisins(t)){ + Sommet u = a.destination(); + if(etat.get(u) == inexplore){ + etat.put(u, encours); + f.addLast(u); + numero.put(u, num++); + System.err.println("num["+u+"]="+numero.get(u)); + distance.put(u, distance.get(t) + 1); + } + } + etat.put(t, explore); + } + return distance; + } + + public void composantesConnexesBFS(){ + HashMap etat = new HashMap(); + for(Sommet s : sommets()) + etat.put(s, inexplore); + int ncc = 0; + for(Sommet s : sommets()) + if(etat.get(s) == inexplore){ + ncc++; + System.err.println("Composante "+ncc); + bfs(etat, s); + } + } + + public boolean bfsBiparti(HashMap etat, HashMap couleur, Sommet s){ + LinkedList f = new LinkedList(); + int c = 0; // la couleur + + etat.put(s, encours); + couleur.put(s, c); + f.addLast(s); + while(! f.isEmpty()){ + Sommet t = f.removeFirst(); + System.err.println("J'explore "+t+" de couleur "+couleur.get(t)); + // c <- couleur des voisins de t + c = 1 - couleur.get(t); + for(Arc a : voisins(t)){ + Sommet u = a.destination(); + if(etat.get(u) == inexplore){ + etat.put(u, encours); + couleur.put(u, c); + f.addLast(u); + } + else if(couleur.get(u) != c){ + System.err.println(u+" est de'ja` colorie' avec la mauvaise couleur"); + return false; + } + } + etat.put(t, explore); + } + return true; + } + + // n'a vraiment un sens que sur les graphes non oriente's connexes + public HashMap estBiparti(){ + HashMap etat = new HashMap(); + HashMap couleur = new HashMap(); + for(Sommet s : sommets()) + etat.put(s, inexplore); + int ncc = 0; + for(Sommet s : sommets()) + if(etat.get(s) == inexplore){ + ncc++; + System.err.println("Composante "+ncc); + if(!bfsBiparti(etat, couleur, s)) + // le graphe n'est pas biparti + return null; + } + return couleur; + } + +////////////DFS + + public void dfs(HashMap etat, Sommet s){ + LinkedList F = new LinkedList(); + int rg = -1; + + F.addFirst(s); + while(! F.isEmpty()){ + Sommet t = F.removeFirst(); + if(etat.get(t) != explore){ + System.err.println("J'explore "+t); + etat.put(t, encours); + ++rg; + System.err.println("rang["+t+"]="+rg); + for(Arc a : voisins(t)){ + Sommet u = a.destination(); + F.addFirst(u); + } + } + etat.put(t, explore); + } + } + + public void dfs(){ + Sommet r = null; + for(Sommet s : sommets()){ + r = s; + break; + } + HashMap etat = new HashMap(); + for(Sommet s : sommets()) + etat.put(s, inexplore); + //dfsFausse(etat, r); // pour avoir un exemple qui foire Data/pchassignet.in + dfs(etat, r); + } + + public int dfsRec(HashMap etat, + HashMap,String> etat_a, + HashMap rang, int rg, + Sommet racine, Sommet s){ + etat.put(s, encours); + rang.put(s, rg++); + System.err.println("J'explore "+s); + for(Arc a : voisins(s)){ + Sommet t = a.destination(); + if(etat.get(t) == inexplore){ + System.err.println("("+s+", "+t+") liaison"); + etat_a.put(a, "arcliaison"); + rg = dfsRec(etat, etat_a, rang, rg, racine, t); + } + else{ + if(etat.get(t) == encours){ + // t est ascendant de s + System.err.println("("+s+", "+t+") arrie`re"); + etat_a.put(a, "arcarriere"); + } + else{ + // t a de'ja` e'te' explore' + if(rang.get(t) < rang.get(racine)){ + System.err.println("("+s+", "+t+") transverse car racine("+t+") <> racine("+s+")"); + etat_a.put(a, "arcinter"); + } + else{ // t est dans la me^me arborescence que s + if(rang.get(s) < rang.get(t)){ + System.err.println("("+s+", "+t+") avant"); + etat_a.put(a, "arcavant"); + } + else{ + System.err.println("("+s+", "+t+") transverse"); + etat_a.put(a, "arcintra"); + } + } + } + } + } + etat.put(s, explore); + return rg; + } + + public void dfsRang(){ + HashMap etat = new HashMap(); + HashMap,String> etat_a = new HashMap,String>(); + HashMap rang = new HashMap(); + + for(Sommet s : sommets()){ + etat.put(s, inexplore); + for(Arc alpha : voisins(s)) + etat_a.put(alpha, "arclibre"); + } + int rg = 0; + for(Sommet s : sommets()) + if(etat.get(s) == inexplore) + rg = dfsRec(etat, etat_a, rang, rg, s, s); + System.err.print(" "); + for(Sommet t : sommets()) + System.err.print(t); + System.err.print("\nrang "); + for(Sommet t : sommets()) + System.err.print(rang.get(t)); + System.err.println(); + } + + // on retourne un arbre couvrant de racine s + public Arbre dfsRec(HashMap etat, Sommet s){ + etat.put(s, encours); + Arbre A = new Arbre(s); + System.err.println("J'explore "+s); + for(Arc a : voisins(s)){ + Sommet t = a.destination(); + if(etat.get(t) == inexplore) + A.ajouterFils(dfsRec(etat, t)); + } + etat.put(s, explore); + return A; + } + + public void dfsCouvrant(){ + Sommet ALPHA = new Sommet("ALPHA"); + Arbre F = new Arbre(ALPHA); + HashMap etat = new HashMap(); + + for(Sommet s : sommets()) + etat.put(s, inexplore); + for(Sommet s : sommets()) + if(etat.get(s) == inexplore) + F.ajouterFils(dfsRec(etat, s)); + System.err.println("F=\n"+F); + } + + //// Tri topologique + + boolean dfsTopo(HashMap etat, + LinkedList L, Sommet s){ + etat.put(s, encours); + System.err.println("J'explore "+s); + for(Arc a : voisins(s)){ + Sommet t = a.destination(); + if(etat.get(t) == inexplore){ + if(! dfsTopo(etat, L, t)) + return false; + } + else if(etat.get(t) == encours){ + // t est ascendant de s + System.err.println("("+s+", "+t+") arrie`re -> erreur"); + return false; + } + } + etat.put(s, explore); + L.addFirst(s); + return true; + } + + public void triTopologique(){ + HashMap etat = new HashMap(); + for(Sommet s : sommets()) + etat.put(s, inexplore); + for(Sommet s : sommets()){ + if(etat.get(s) == inexplore){ + LinkedList L = new LinkedList(); + if(! dfsTopo(etat, L, s)){ + System.err.println("Graphe avec circuit"); + return; + } + for(Sommet t : L) + System.err.print(t+" -> "); + System.err.println(); + } + } + } + + //// Points d'attache + int dfsAttache(HashMap etat, + HashMap rang, int rg, + HashMap rat, Sommet racine, Sommet s){ + etat.put(s, encours); + System.err.println("J'explore "+s); + rang.put(s, rg++); + int rats = rang.get(s), ratt; + for(Arc a : voisins(s)){ + Sommet t = a.destination(); + if(etat.get(t) == inexplore){ + rg = dfsAttache(etat, rang, rg, rat, racine, t); + ratt = rat.get(t); + } + else if(etat.get(t) == encours) + // (s, t) est un arc arrie`re + ratt = rang.get(t); + else if(rang.get(t) < rang.get(racine)) + // (s, t) transverse inter + continue; + else // (s, t) avant ou transverse intra + ratt = rang.get(t); + // HERE: vrai? Cf. exemple bbc1 pour l semble faux...! + rats = Math.min(rats, ratt); + } + rat.put(s, rats); + etat.put(s, explore); + return rg; + } + + public void pointsDAttache(){ + HashMap etat = new HashMap(); + HashMap rang = new HashMap(); + HashMap rat = new HashMap(); + + for(Sommet s : sommets()) + etat.put(s, inexplore); + int rg = 0; + for(Sommet s : sommets()) + if(etat.get(s) == inexplore) + rg = dfsAttache(etat, rang, rg, rat, s, s); + System.err.println("Rangs"); + for(Sommet s : sommets()) + System.err.println(s+" "+rang.get(s)); + System.err.println("Rangs d'attache"); + for(Sommet s : sommets()) + System.err.println(s+" "+rat.get(s)); + } + + //// Composantes fortement connexes + + final static int libre = 0, empile = 1, exclus = 2, pointdentree = 3, dansCFC = 4; + + int dfsCfc(HashMap etat, + HashMap etat_cfc, + HashMap,String> etat_a, + LinkedList pile, + HashMap rang, int rg, + HashMap rat, + Sommet racine, Sommet s){ + etat.put(s, encours); + System.err.println("J'explore "+s); + rang.put(s, rg++); + rat.put(s, rang.get(s)); + pile.addFirst(s); + etat_cfc.put(s, empile); + for(Arc a : voisins(s)){ + Sommet t = a.destination(); + if(etat_cfc.get(t) == inexplore){ + System.err.println("("+s+", "+t+") liaison"); + etat_a.put(a, "arcliaison"); + rg = dfsCfc(etat, etat_cfc, etat_a, pile, rang, rg, rat, racine, t); + if(rat.get(t) < rat.get(s)){ + rat.put(s, rat.get(t)); + } + } + else{ + if(etat_cfc.get(t) == empile){ + if(rang.get(t) > rang.get(s)) + // (s, t) est avant + etat_a.put(a, "arcavant"); + else{ + // (s, t) est arriere ou intra-arbre + // t est dans C(s) car t descendant de s et s -> t + if(etat.get(t) == encours){ + System.err.println("("+s+", "+t+") arrie`re"); + etat_a.put(a, "arcarriere"); + } + else{ + System.err.println("("+s+", "+t+") intra-arbre"); + etat_a.put(a, "arcintra"); + } + System.err.println(t+" est dans C("+s+")"); + if(rang.get(t) < rat.get(s)) + rat.put(s, rang.get(t)); + } + } + else{ + // t est exclus + System.err.println(t+" exclus"); + if(rang.get(t) < rang.get(racine)) + // (s, t) est inter-arbre + etat_a.put(a, "arcinter"); + else + etat_a.put(a, "arcintra"); + } + } + } + etat.put(s, explore); + System.err.print("rang["+s+"]="+rang.get(s)); + System.err.println(" rat["+s+"]="+rat.get(s)); + if(rat.get(s) == rang.get(s)){ + // s est un point d'entre'e + etat_cfc.put(s, pointdentree); + for(Sommet u : pile){ + if(u.equals(s)) + break; + etat_cfc.put(u, dansCFC); + } + Sommet t; + System.err.print("CFC={"); + do{ + t = pile.removeFirst(); + etat_cfc.put(t, exclus); + System.err.print(" "+t); + } while(! t.equals(s)); + System.err.println(" }"); + } + return rg; + } + + public void cfc(){ + HashMap etat = new HashMap(); + HashMap etat_cfc = new HashMap(); + HashMap,String> etat_a = new HashMap, String>(); + HashMap rang = new HashMap(); + HashMap rat = new HashMap(); + LinkedList pile = new LinkedList(); + + for(Sommet s : sommets()){ + etat.put(s, inexplore); + etat_cfc.put(s, libre); + for(Arc alpha : voisins(s)) + etat_a.put(alpha, "arclibre"); + } + int rg = 0; + for(Sommet s : sommets()) + if(etat.get(s) == inexplore) + rg = dfsCfc(etat, etat_cfc, etat_a, pile, rang, rg, rat, s, s); + System.err.println("Rangs"); + for(Sommet s : sommets()) + System.err.println(s+" "+rang.get(s)); + } + + //// Points d'articulation et blocs + + void depiler(LinkedList> pile, Sommet s, Sommet t){ + Sommet x, y; + System.err.print("Bloc = {"); + do{ + Arc a = pile.removeFirst(); + x = a.origine(); + y = a.destination(); + System.err.print("("+x+", "+y+")"); + } while(!x.equals(s) && !y.equals(t)); + System.err.println("}"); + } + + void depiler(LinkedList> pile){ + System.err.print("Bloc_racine = {"); + while(! pile.isEmpty()){ + Arc a = pile.removeFirst(); + System.err.print("("+a.origine()+", "+a.destination()+")"); + } + System.err.println("}"); + } + + // pere -> s + int dfsPda(LinkedList lpda, + HashMap etat, + LinkedList> pile, + HashMap rang, int rg, + HashMap rat, + Sommet pere, Sommet s){ + etat.put(s, encours); + System.err.println("J'explore "+s); + rang.put(s, rg++); + int rats = rang.get(s); + for(Arc a : voisins(s)){ + Sommet t = a.destination(); + if(etat.get(t) == inexplore){ + System.err.println("("+s+", "+t+") liaison"); + pile.addFirst(a); + rg = dfsPda(lpda, etat, pile, rang, rg, rat, s, t); + rats = Math.min(rats, rat.get(t)); + if(rat.get(t) >= rang.get(s)){ + System.err.println(s+" est point d'articulation"); + depiler(pile, s, t); + lpda.addFirst(s); + } + } + else if((rang.get(t) < rang.get(s)) && !t.equals(pere)){ + System.err.println("("+s+", "+t+") arrie`re ou transverse"); + pile.addFirst(a); + rats = Math.min(rats, rang.get(t)); + } + } + rat.put(s, rats); + System.err.print("rang["+s+"]="+rang.get(s)); + System.err.println(" rat["+s+"]="+rat.get(s)); + etat.put(s, explore); + return rg; + } + + // s est la racine de l'arborescence + int dfsPda(LinkedList lpda, + HashMap etat, + LinkedList> pile, + HashMap rang, int rg, + HashMap rat, Sommet s){ + etat.put(s, encours); + System.err.println("J'explore "+s); + rang.put(s, rg++); + int rats = rang.get(s); + int nfils = 0; + for(Arc a : voisins(s)){ + Sommet t = a.destination(); + if(etat.get(t) == inexplore){ + System.err.println("("+s+", "+t+") liaison"); + pile.addFirst(a); + rg = dfsPda(lpda, etat, pile, rang, rg, rat, s, t); + nfils++; + } + } + if(nfils > 1){ + lpda.addFirst(s); + System.err.println(s+" est racine ET point d'articulation"); + depiler(pile); + } + rat.put(s, rats); + System.err.print("rang["+s+"]="+rang.get(s)); + System.err.println(" rat["+s+"]="+rat.get(s)); + etat.put(s, explore); + return rg; + } + + public void pointsDArticulation(LinkedList lpda, + HashMap rat){ + HashMap etat = new HashMap(); + HashMap rang = new HashMap(); + + for(Sommet s : sommets()) + etat.put(s, inexplore); + int rg = 0; + LinkedList> pile = new LinkedList>(); + for(Sommet s : sommets()) + if(etat.get(s) == inexplore) + // nouvelle composante connexe + rg = dfsPda(lpda, etat, pile, rang, rg, rat, s); + System.err.println("Rangs"); + for(Sommet s : sommets()) + System.err.println(s+" "+rang.get(s)); + } + + public static String XMLHeader(){ + String str = "\n"; + str += "\n"; + str += " \n"; + str += " 1.3.9\n"; + str += " \n"; + str += " \n"; + str += " \n"; + str += " \n"; + str += " \n"; + str += " \n"; + return str; + } + public static String XMLTrailer(){ + return "\n"; + } + // pos[s] est la position de s dans le plan, color[s] le contenu de s, par exemple une couleur. + // pos[s] doit etre de la forme x,y + public String toGraphml(String nom, HashMap pos, HashMap color){ + String str = XMLHeader(); + str += " \n"; + else + str += " edgedefault=\"undirected\">\n"; + // les sommets + for(Sommet s : sommets()){ + str += " \n"; + if(pos != null) + str += " "+pos.get(s)+"\n"; + if(color != null) + str += " " + color.get(s) + "\n"; + str += " " + s + "\n"; + str += " \n"; + } + // les aretes + for(Sommet s : sommets()){ + for(Arc arc : voisins(s)){ + // TODO: permettre des couleurs et labels sur les arcs + Sommet t = arc.destination(); + str += " \n"; + str += " 1\n"; + str += " 1\n"; + str += " \n"; + } + } + str += " \n"; + str += XMLTrailer(); + return str; + }*/ +} + diff --git a/src/designPattern/grapheX/GrapheGenerique.java b/src/designPattern/grapheX/GrapheGenerique.java new file mode 100644 index 0000000..1b9df35 --- /dev/null +++ b/src/designPattern/grapheX/GrapheGenerique.java @@ -0,0 +1,81 @@ +package designPattern.grapheX; + +import java.util.Collection; + +/** + * Super-classe abstraite des graphes, les sommets doivent �tre identifiables. + * + * @author FMorain (morain@lix.polytechnique.fr) + * @author PChassignet (chassign@lix.polytechnique.fr) + * @version 2007.03.21 + */ + +public abstract class GrapheGenerique { + + /** + * @return le nombre de sommets de ce graphe. + */ + public abstract int taille(); + + /** + * @param s + * le sommet � ajouter � ce graphe. + */ + public abstract void ajouterSommet(S s); + + /** + * @return une Collection de tous les sommets de ce graphe. + */ + public abstract Collection sommets(); + + /** + * Teste l'existence de l'arc de s � t dans ce graphe. + * + * @param s + * l'origine de l'arc, + * @param t + * l'extr�mit� de l'arc. + */ + public abstract boolean existeArc(S s, S t); + + /** + * @param s + * l'origine de l'arc, + * @param t + * l'extr�mit� de l'arc, + * @param val + * une valeur enti�re attach�e � l'arc de s � t + * dans ce graphe. + */ + public abstract void ajouterArc(S s, S t, int val); + + /** + * @param s + * l'origine de l'arc, + * @param t + * l'extr�mit� de l'arc. + * @return la valeur enti�re attach�e � l'arc de s � t + * dans ce graphe. + */ + public abstract int valeurArc(S s, S t); + + /** + * Supprime l'arc de s � t dans ce graphe. + * + * @param s + * l'origine de l'arc, + * @param t + * l'extr�mit� de l'arc. + */ + public abstract void enleverArc(S s, S t); + + /** + * @param s + * l'origine des arcs. + * @return une Collection de tous les arcs de ce graphe ayant + * s pour origine. Ces arcs sont de type + * Arc<S>. + */ + public abstract Collection> voisins(S s); + +} diff --git a/src/designPattern/grapheX/Identifiable.java b/src/designPattern/grapheX/Identifiable.java new file mode 100644 index 0000000..603d30e --- /dev/null +++ b/src/designPattern/grapheX/Identifiable.java @@ -0,0 +1,100 @@ +package designPattern.grapheX; + +/** + * D�finit des objets identifi�s par une String. Deux objets + * Identifiable qui sont construit avec le m�me identifiant seront + * consid�r�s comme identiques pour les m�thodes hashCode, + * equals et compareTo. Cette classe sert notamment de + * super-classe pour les sommets d'un graphe. + * + * @author PChassignet (chassign@lix.polytechnique.fr) + * @version 2007.03.21 + */ + +public class Identifiable implements Comparable { + private final String ident; + + /** + * @param identifiant + * l'identifiant pour cet objet. + */ + public Identifiable(String identifiant) { + ident = identifiant; + } + + /** + * @return l'identifiant pour cet objet. + */ + public final String identifiant() { + return ident; + } + + /** + * @return le hashCode de l'identifiant de cet objet. + */ + @Override +public final int hashCode() { + if (ident == null) + return 0; + else + return ident.hashCode(); + } + + /** + * @return le r�sultat de equals sur les identifiants. + */ + @Override +public final boolean equals(Object o) { + if (!(o instanceof Identifiable)) { + return false; + } + String oid = ((Identifiable) o).ident; + if (ident == null) + return oid == null; + else + return ident.equals(oid); + } + + /** + * @return le r�sultat de compareTo sur les identifiants. + */ +public final int compareTo(Identifiable id) { + if (ident == null) + if (id.ident == null) + return 0; + else + return -1; + else if (id.ident == null) + return 1; + else + return ident.compareTo(id.ident); + } + + /** + * @param id1 + * premier objet � comparer, + * @param id2 + * second objet � comparer, + * @return le r�sultat de id1.compareTo(id2). + */ + public static final int compare(Identifiable id1, Identifiable id2) { + if (id1 == null) + if (id2 == null) + return 0; + else + return -1; + else if (id2 == null) + return 1; + else + return id1.compareTo(id2); + } + + @Override +public String toString() { + if (ident == null) + return "[null]"; + else + return "[\"" + ident + "\"]"; + } + +} diff --git a/src/designPattern/grapheX/Sommet.java b/src/designPattern/grapheX/Sommet.java new file mode 100644 index 0000000..2048e5a --- /dev/null +++ b/src/designPattern/grapheX/Sommet.java @@ -0,0 +1,23 @@ +package designPattern.grapheX; + +/** + * Classe de sommets, toutes les propri�t�s sont h�rit�es de Identifiable. + * + * @author FMorain (morain@lix.polytechnique.fr) + * @author PChassignet (chassign@lix.polytechnique.fr) + * @version 2007.03.21 + */ + +public class Sommet extends Identifiable { + + public Sommet(String nn) { + super(nn); + } + + @Override +public String toString() { + return identifiant(); + } + + +} diff --git a/src/designPattern/grapheX/SommetValue.java b/src/designPattern/grapheX/SommetValue.java new file mode 100644 index 0000000..2dfba10 --- /dev/null +++ b/src/designPattern/grapheX/SommetValue.java @@ -0,0 +1,11 @@ +package designPattern.grapheX; + +public class SommetValue { + Sommet s; + int valeur; + + SommetValue(Sommet ss, int vv){ + s = ss; + valeur = vv; + } +} diff --git a/src/designPattern/reseauSocial/core/Member.java b/src/designPattern/reseauSocial/core/Member.java new file mode 100644 index 0000000..895531b --- /dev/null +++ b/src/designPattern/reseauSocial/core/Member.java @@ -0,0 +1,44 @@ +package designPattern.reseauSocial.core; + +import designPattern.grapheX.Sommet; + +public class Member extends Sommet implements MemberInterface { + + private String localisation; + private Enum force; + + public Member(String nn) { + super(nn); + // TODO Auto-generated constructor stub + } + + @Override + public String getLocation() { + return this.localisation; + } + + @Override + public void setLocation(String s) { + this.localisation = s; + } + + @Override + public String getName() { + return super.toString(); + } + + public Enum getForce() { + return force; + } + + public void setForce(Enum force) { + this.force = force; + } + + public void addMember(String nom, String location, SocialNetworkInterface reseau) { + Member m = new Member(nom); + m.setLocation(location); + reseau.addMember(m); + } + +} diff --git a/src/designPattern/reseauSocial/core/MemberInterface.java b/src/designPattern/reseauSocial/core/MemberInterface.java new file mode 100755 index 0000000..1416c5d --- /dev/null +++ b/src/designPattern/reseauSocial/core/MemberInterface.java @@ -0,0 +1,10 @@ +package designPattern.reseauSocial.core; + +public interface MemberInterface { + + + public String getLocation(); + public void setLocation(String s); + + public String getName(); +} diff --git a/src/designPattern/reseauSocial/core/SocialNetWorkImpl.java b/src/designPattern/reseauSocial/core/SocialNetWorkImpl.java new file mode 100644 index 0000000..3e0be47 --- /dev/null +++ b/src/designPattern/reseauSocial/core/SocialNetWorkImpl.java @@ -0,0 +1,85 @@ +package designPattern.reseauSocial.core; + +import java.util.Collection; +import java.util.Observable; +import java.util.Set; + +import designPattern.facebookGhost.FacebookGhostNetwork; +import designPattern.grapheSimple.GrapheSimple; + +@SuppressWarnings("deprecation") +public class SocialNetWorkImpl implements SocialNetworkInterface{ + + private String nom; + private GrapheSimple reseau; + + public SocialNetWorkImpl() { + this("Default"); + } + + public SocialNetWorkImpl(String n) { + this.nom = n; + reseau = new GrapheSimple(); + } + + @Override + public void update(Observable arg0, Object arg1) { + // TODO Auto-generated method stub + + } + + @Override + public Member getMember(String identifier) { + return reseau.getSommet(identifier); + } + + @Override + public Collection getMembers() { + return reseau.sommets(); + } + + @Override + public void addMember(Member m) { + reseau.ajouterSommet(m); + } + + @Override + public Member addMember(String ident, FacebookGhostNetwork fg) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Member addMember(String identifier) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void relate(Strength force, Member member, Member friend) { + // TODO Auto-generated method stub + + } + + @Override + public Set relatedToRank(Member member, int rank) { + // TODO Auto-generated method stub + return null; + } + + @Override + public int distance(Member member1, Member member2) { + // TODO Auto-generated method stub + return 0; + } + + public String getNom() { + return nom; + } + + public void setNom(String n) { + this.nom = n; + } + + +} diff --git a/src/designPattern/reseauSocial/core/SocialNetworkInterface.java b/src/designPattern/reseauSocial/core/SocialNetworkInterface.java new file mode 100755 index 0000000..ec4101c --- /dev/null +++ b/src/designPattern/reseauSocial/core/SocialNetworkInterface.java @@ -0,0 +1,74 @@ +package designPattern.reseauSocial.core; + + +import java.util.Collection; +import java.util.Observer; +import java.util.Set; + +import designPattern.facebookGhost.FacebookGhostNetwork; + +/** + * + * Basic" interface for defining a social network + * + * @author blay + * + */ + +@SuppressWarnings("deprecation") +public interface SocialNetworkInterface extends Observer{ + + /** + * @param identifier for a member + * @return member if known by the network + */ + public T getMember(String identifier); + + /** + * @return the set of members belonging to the network + */ + public Collection getMembers(); + + /** + * add a member to the network + */ + public void addMember(T membre); + + /** + * @param ident + * @param fg a facebookGhostNetwork, if the member belongs to fg, an adapter to this network is created. + * @return the member corresponding to the identifier. If a member with this identifer already exists, the member is not created. + */ + public T addMember(String ident, FacebookGhostNetwork fg); + public T addMember(String identifier); + + + /** + * + * Add the relationship between a member and a friend with a given force. + * + * @param force + * @param member + * @param friend + * + */ + public void relate(Strength force, T member, T friend); + + /** + * @param member + * @param rank + * @return returns all members given the rank (at rank 1 : direct neighbors; at rank 2 : neighbors of neighbors. + * A member appears at the lowest rank, it does not appear in a higher rank + */ + public Set relatedToRank(T member, int rank); + + /** + * @param member1 + * @param member2 + * @return distance between the two members + */ + public int distance(T member1, T member2); + + + +} diff --git a/src/designPattern/reseauSocial/core/Strength.java b/src/designPattern/reseauSocial/core/Strength.java new file mode 100755 index 0000000..9835d50 --- /dev/null +++ b/src/designPattern/reseauSocial/core/Strength.java @@ -0,0 +1,17 @@ +package designPattern.reseauSocial.core; + +public enum Strength { + LOW (4), MEDIUM (3), HIGH (2), STRONG(1); + + int value; + + public int getValue() { + return value; + } + + Strength( int pvalue){ + value = pvalue; + } + + +} diff --git a/src/forum/Administrateur.java b/src/forum/Administrateur.java new file mode 100755 index 0000000..6e14ba6 --- /dev/null +++ b/src/forum/Administrateur.java @@ -0,0 +1,15 @@ +package forum; + +public class Administrateur { + + private String nom; + + public Administrateur() { + + } + + public Administrateur(String nomAdmin) { + this.nom = nomAdmin; + } + +} \ No newline at end of file diff --git a/src/forum/Canal.java b/src/forum/Canal.java new file mode 100755 index 0000000..57bb469 --- /dev/null +++ b/src/forum/Canal.java @@ -0,0 +1,17 @@ +package forum; + +import java.util.ArrayList; + +public class Canal { + + private int maxMessage; + private String nomCanal; + private Message message; + ArrayList canal = new ArrayList(); + + public Canal(String nomCanal, int maxMessage) { + this.nomCanal = nomCanal; + this.maxMessage = maxMessage; + } + +} diff --git a/src/forum/CanalDeBreve.java b/src/forum/CanalDeBreve.java new file mode 100755 index 0000000..a2000aa --- /dev/null +++ b/src/forum/CanalDeBreve.java @@ -0,0 +1,14 @@ +package forum; + +public class CanalDeBreve { + + private int tailleBreves; + private String nomCanal; + private Message message; + + public CanalDeBreve(String nomCanal, int tailleBreves) { + this.nomCanal = nomCanal; + this.tailleBreves = tailleBreves; + } + +} diff --git a/src/forum/CanalParDefaut.java b/src/forum/CanalParDefaut.java new file mode 100755 index 0000000..61fd710 --- /dev/null +++ b/src/forum/CanalParDefaut.java @@ -0,0 +1,9 @@ +package forum; + +public class CanalParDefaut { + public String nom; + + public CanalParDefaut(String nom) { + } + +} diff --git a/src/forum/Controleur.java b/src/forum/Controleur.java new file mode 100755 index 0000000..d5f07f4 --- /dev/null +++ b/src/forum/Controleur.java @@ -0,0 +1,88 @@ +package forum; + +public class Controleur { + + private GestionnaireForum registreF = new GestionnaireForum(); + private GestionnaireCanal registreC = new GestionnaireCanal(); + private UserConsole ui = new UserConsole(); + + public void start() throws Exception { + String commande = ui.lireCommande(); + switch (commande.charAt(0)) { + case UserConsole.COM_CREER_FORUM: + creerForum(); + start(); + break; + case UserConsole.COM_CREER_CANAL: + creerCanal(); + start(); + break; + case UserConsole.COM_POSTER_MESSAGES: +// posterMessage(); + start(); + break; + case UserConsole.COM_LIRE_MESSAGES: +// lireMessage(); + start(); + break; + case UserConsole.COM_STOP: + ui.afficher("Au revoir "); + // Memoire.save(registre, "sauvegarde.txt"); + System.exit(0); + break; + default: + ui.afficher("La commande spécifiée n'existe pas\n"); + Thread.sleep(1000); + start(); + } + } + + private void creerForum() { + String nomForum = ui.getValeur("Nom du forum :"); + registreF.addForum(nomForum); + + } + + private void creerCanal() { + String nomForum = ui.getValeur("Entrer le nom du forum dans lequel vous voulez créer un canal :"); + while (!GestionnaireForum.doesExist(nomForum)) { + System.out.println("Erreur : Il n'y a aucun forum de ce nom."); + nomForum = ui.getValeur("Entrer le nom du forum dans lequel vous voulez créer un canal :"); + } + + String typeCanal; + System.out.println("Quel type de canal voulez-vous créer ?"); + typeCanal = ui.getValeur("Entrer \"c\" pour canal ou \"b\" pour canal de brèves"); + while (!(typeCanal.contentEquals("c") || typeCanal.contentEquals("b"))) { + System.out.println("Erreur : donnée invalide."); + typeCanal = ui.getValeur("Quel type de canal voulez-vous créer ?"); + } + + String nomCanal = ui.getValeur("Entrer le nom du canal"); + + if (typeCanal.contentEquals("c")) { + System.out.println("Voulez-vous changer le nombre de messages max possibles pour ce canal?"); + String nb = ui.getValeur("Répondre y pour oui, n pour non"); + try { + int maxMessage = Integer.parseInt(nb); + registreC.CreerCanal(nomCanal, maxMessage); + } catch (NumberFormatException nfe) { + System.out.println("Erreur, ce n'est pas un entier"); + } + } else { + String nb = ui.getValeur("Quelle taille max voulez-vous pour les brèves?"); + try { + int tailleBreve = Integer.parseInt(nb); + registreC.CreerCanalDeBreve(nomCanal, tailleBreve); + } catch (NumberFormatException nfe) { + System.out.println("Erreur, ce n'est pas un entier"); + } + } + + } + + public static void main(String[] args) throws Exception { + Controleur c = new Controleur(); + c.start(); + } +} \ No newline at end of file diff --git a/src/forum/Forum.java b/src/forum/Forum.java new file mode 100755 index 0000000..7ddbf90 --- /dev/null +++ b/src/forum/Forum.java @@ -0,0 +1,17 @@ +package forum; + +public class Forum { + + private String title; + private CanalParDefaut defaultCanal; + + public Forum(String nomForum) { + this.title = nomForum; + this.defaultCanal = new CanalParDefaut("defaut"); + } + + public String getTitle() { + return title; + } + +} diff --git a/src/forum/GestionnaireCanal.java b/src/forum/GestionnaireCanal.java new file mode 100755 index 0000000..2822698 --- /dev/null +++ b/src/forum/GestionnaireCanal.java @@ -0,0 +1,26 @@ +package forum; + +import java.util.HashMap; + +public class GestionnaireCanal { + + private static HashMap canal = new HashMap(); + private static HashMap canalDeBreve = new HashMap(); + + public void CreerCanal(String nomCanal, int maxMessage) { + canal.put(nomCanal, new Canal(nomCanal, maxMessage)); + } + + public void CreerCanalDeBreve(String nomCanal, int tailleBreves) { + canalDeBreve.put(nomCanal, new CanalDeBreve(nomCanal, tailleBreves)); + } + + + public static boolean doesExist(String nomCanal) { + if (canal.containsKey(nomCanal)) { + return true; + } + return false; + } + +} \ No newline at end of file diff --git a/src/forum/GestionnaireForum.java b/src/forum/GestionnaireForum.java new file mode 100755 index 0000000..fbbb2e1 --- /dev/null +++ b/src/forum/GestionnaireForum.java @@ -0,0 +1,29 @@ +package forum; + +import java.util.HashMap; + +public class GestionnaireForum { + + private static HashMap forum = new HashMap(); + + public Forum getForum(String nomForum) { + return forum.get(nomForum); + } + + public void addForum(String nomForum) { + if (!doesExist(nomForum)) { + forum.put(nomForum, new Forum(nomForum)); + + } else { + System.out.println("erreur : Un forum du même nom existe déjà."); + } + } + + public static boolean doesExist(String nom) { + if (forum.containsKey(nom)) { + return true; + } + return false; + } + +} diff --git a/src/forum/Memoire.java b/src/forum/Memoire.java new file mode 100755 index 0000000..9da8972 --- /dev/null +++ b/src/forum/Memoire.java @@ -0,0 +1,52 @@ +package forum; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Based on http://www.jmdoudoux.fr/java/dej/chap-serialisation.htm + * + * @author Mireille Blay + * + */ + +public class Memoire { + + static Logger monLog = Logger.getLogger(Memoire.class.getName()); + + private Memoire() { + super(); + } + + public static void save(Object o, String fileName) { + + try (FileOutputStream fichier = new FileOutputStream(fileName); + ObjectOutputStream oos = new ObjectOutputStream(fichier);) { + oos.writeObject(o); + oos.flush(); + } catch (java.io.IOException e) { + monLog.log(Level.SEVERE, e.getMessage(), e); + } + } + + + public static Object read(String fileName) { + + Object o = null; + try (FileInputStream fichier = new FileInputStream(fileName); + ObjectInputStream ois = new ObjectInputStream(fichier);) { + o = ois.readObject(); + } catch ( java.io.FileNotFoundException e) { + monLog.log(Level.SEVERE, "Pas de precedentes sauvegardes",e); + } catch (final java.io.IOException e) { + monLog.log(Level.SEVERE, "Pbme de fichier",e); + } catch (final ClassNotFoundException e) { + monLog.log(Level.SEVERE, "Pbme de sauvegarde, classe inattendue",e); + } + return o; + } +} \ No newline at end of file diff --git a/src/forum/Message.java b/src/forum/Message.java new file mode 100755 index 0000000..d05e5ad --- /dev/null +++ b/src/forum/Message.java @@ -0,0 +1,7 @@ +package forum; + +public class Message { + + private String contenu; + +} diff --git a/src/forum/Producteur.java b/src/forum/Producteur.java new file mode 100755 index 0000000..0a77682 --- /dev/null +++ b/src/forum/Producteur.java @@ -0,0 +1,15 @@ +package forum; + +import java.util.ArrayList; + +public class Producteur extends Administrateur { + + public String nom; + public ArrayList canal = new ArrayList (); + + public Producteur() { + super(); + // TODO Auto-generated constructor stub + } + +} diff --git a/src/forum/UserConsole.java b/src/forum/UserConsole.java new file mode 100755 index 0000000..f9ea3da --- /dev/null +++ b/src/forum/UserConsole.java @@ -0,0 +1,80 @@ +package forum; + +import java.util.List; +import java.util.Scanner; +import java.util.Set; + +public class UserConsole { + Scanner sc = new Scanner(System.in); + + public static final char COM_CREER_FORUM = 'f'; + public static final char COM_CREER_CANAL = 'c'; + public static final char COM_LIRE_MESSAGES = 'l'; + public static final char COM_POSTER_MESSAGES = 'p'; + public static final char COM_STOP = 's'; + + //On pourra modifier facilement pour par exemple utiliser des logger. + private final void sop(String s) { + System.out.println(s); + } + + public String lireCommande() { + sop("------- COMMANDES ----------"); + sop("creer Forum : " + COM_CREER_FORUM ) ; + sop("creer Canal : " + COM_CREER_CANAL); + sop("lire messages : " + COM_LIRE_MESSAGES); + sop("poster un nouveau message : " + COM_POSTER_MESSAGES); + sop("stop : " + COM_STOP); + sop("Que voulez-vous faire ?"); + String str = sc.nextLine().toLowerCase(); + sop("Vous avez saisi la commande: " + str); + return str; + } + + public void afficher(String str) { + sop(str); + } + + public void afficherMessages(List arrayList) { + int i = 1; + sop("\t messages : "); + if (arrayList == null) { + sop("\t Pas de messages "); + } else + for (Message m : arrayList) { + sop("\t" + i + "-\t" + m); + i++; + } + } + + public String getNomDuForum(Set nomsForum) { + sop("--- Forum disponibles --- "); + afficheListe(nomsForum); + sop("==> Nom du Forum ?"); + return sc.nextLine(); + } + + public void afficheListe(Set noms) { + for (String nom : noms) + sop("\t"+ nom); + } + + + public String getNomCanal(Set nomsCanaux) { + sop("--- Canals disponibles --- "); + afficheListe(nomsCanaux); + sop("==> Nom du Canal ?"); + return sc.nextLine(); + } + + + public String getValeur(String message) { + sop(message); + return sc.nextLine(); + } + + public String write(){ + return sc.nextLine(); + } + +} diff --git a/src/openClosedPrinciples/core/AlreadyBooked.java b/src/openClosedPrinciples/core/AlreadyBooked.java new file mode 100644 index 0000000..e402214 --- /dev/null +++ b/src/openClosedPrinciples/core/AlreadyBooked.java @@ -0,0 +1,18 @@ +package openClosedPrinciples.core; + +/** + * @author Mireille Blay-Fornarino + * + */ +public class AlreadyBooked extends Exception { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public AlreadyBooked(String message) { + super(message); + } + +} diff --git a/src/openClosedPrinciples/core/AucunItemCorrespondant.java b/src/openClosedPrinciples/core/AucunItemCorrespondant.java new file mode 100644 index 0000000..d4adb4b --- /dev/null +++ b/src/openClosedPrinciples/core/AucunItemCorrespondant.java @@ -0,0 +1,14 @@ +package openClosedPrinciples.core; + +public class AucunItemCorrespondant extends Exception { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public AucunItemCorrespondant(String message) { + super(message); + } + +} diff --git a/src/openClosedPrinciples/core/Car.java b/src/openClosedPrinciples/core/Car.java new file mode 100644 index 0000000..d831ac7 --- /dev/null +++ b/src/openClosedPrinciples/core/Car.java @@ -0,0 +1,50 @@ +package openClosedPrinciples.core; + +/** + * @author Mireille Blay-Fornarino + * + */ + +public class Car { + private String numberPlate; + private double dayPrice; + + + /// Constructeurs + + public Car(String numberPlate, double dayPrice) { + super(); + this.numberPlate = numberPlate; + this.dayPrice = dayPrice; + } + + + /// Accesseurs et mutateurs + + public String getNumberPlate() { + return numberPlate; + } + + public void setNumberPlate(String numberPlate) { + this.numberPlate = numberPlate; + } + + public double getDayPrice() { + return dayPrice; + } + + public void setDayPrice(double dayPrice) { + this.dayPrice = dayPrice; + } + + + /// Méthodes + + // Afficher + @Override + public String toString() { + return "Car [numberPlate=" + numberPlate + // ", rentals=" + rentals + + ", dayPrice=" + super.toString() + "]"; + } + +} diff --git a/src/openClosedPrinciples/core/CarRental.java b/src/openClosedPrinciples/core/CarRental.java new file mode 100644 index 0000000..ee3bcf4 --- /dev/null +++ b/src/openClosedPrinciples/core/CarRental.java @@ -0,0 +1,77 @@ +package openClosedPrinciples.core; + +import java.time.LocalDate; + +/** + * @author Mireille Blay-Fornarino + * + * 6 oct. 2018 + */ +public class CarRental extends PayingItem { + private String carNumber; + private int duration; + private LocalDate beginDate; + + + /// Constructeurs + + private CarRental(String carNumber, double dayPrice, int duration, LocalDate beginDate) { + super(dayPrice); + this.carNumber = carNumber; + this.duration = duration; + this.beginDate = beginDate; + } + + public CarRental(Car c, LocalDate beginDate, int duration) { + //On considere que le prix de la location ne doit plus bouger même si le prix de la voiture change + this(c.getNumberPlate(),c.getDayPrice(),duration,beginDate); + } + + + /// Accesseurs et mutateurs + + public String getCarNumber() { + return carNumber; + } + public void setCarNumber(String carNumber) { + this.carNumber = carNumber; + } + public int getDuration() { + return duration; + } + public void setDuration(int duration) { + this.duration = duration; + } + public LocalDate getBeginDate() { + return beginDate; + } + public void setBeginDate(LocalDate beginDate) { + this.beginDate = beginDate; + } + + + /// Méthodes + + // Récupérer le prix + public double getPrice() { + return super.price*duration; + } + + // Rechercher si dispo un jour + public boolean includeADate(LocalDate[] dates) { + for (LocalDate d : dates) { + if (d.equals(beginDate)) + return true; + if ( (d.isAfter(beginDate)) && + (d.isBefore(beginDate.plusDays(duration) ) ) ) + return true; + } + return false; + } + + // Afficher + @Override + public String toString() { + return "CarRental [carNumber=" + carNumber.toString() + ", duration=" + duration + ", beginDate=" + beginDate + ", price=" +super.toString() + "]"; + } +} diff --git a/src/openClosedPrinciples/core/CarRentalService.java b/src/openClosedPrinciples/core/CarRentalService.java new file mode 100644 index 0000000..596ae31 --- /dev/null +++ b/src/openClosedPrinciples/core/CarRentalService.java @@ -0,0 +1,77 @@ +package openClosedPrinciples.core; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +/** + * @author Mireille Blay-Fornarino + * + * 6 oct. 2018 + */ +public class CarRentalService extends Service { + private ArrayList cars; + + + /// Constructeurs + + public CarRentalService(ArrayList cars) { + super(new ArrayList()); + this.cars = cars; + } + + /// Méthodes + + // Récupérer la liste des voitures dispo tel date et telle durée + public List getAvailableCars(LocalDate d, int duration) { + ArrayList availableCars = new ArrayList<>(); + LocalDate[] dates = DateTools.getDays(d, duration); + for (Car c : cars) { + if (isAvailable(c, dates)) { + availableCars.add(c); + } + } + return availableCars; + } + + // On voit si une voiture est dispo pendant ces dates + private boolean isAvailable(Car c, LocalDate[] dates) { + for (CarRental carRental : payingItemList) { + if (c.getNumberPlate().equals(carRental.getCarNumber()) && + (carRental.includeADate(dates)) ) { + return false; + } + } + return true; + } + + // On réserve une voiture + public CarRental book(Car c, LocalDate d, int duration) throws NotPossibleCarRentalException { + CarRental carRental = null; + if (cars == null || !(cars.contains(c)) ) + throw new NotPossibleCarRentalException("Not known car"); + LocalDate[] dates = DateTools.getDays(d, duration); + if (isAvailable(c, dates)) { + carRental = new CarRental(c, d, duration); + payingItemList.add(carRental); + } + return carRental; + } + + // Recherche d'une voiture correspondant à la description + public CarRental find(Description description) { + List listeVoitures = this.getAvailableCars(description.getDateDepart(), description.getDuree()); + listeVoitures.sort(Comparator.comparing(Car::getDayPrice)); + CarRental cr = null; + try{ + if(listeVoitures.isEmpty()) { + return null; + } + cr = this.book(listeVoitures.get(0), description.getDateDepart(), description.getDuree()); + }catch(NotPossibleCarRentalException e) { + e.getMessage(); + } + return cr; + } +} diff --git a/src/openClosedPrinciples/core/DateTools.java b/src/openClosedPrinciples/core/DateTools.java new file mode 100644 index 0000000..8bdc4f1 --- /dev/null +++ b/src/openClosedPrinciples/core/DateTools.java @@ -0,0 +1,37 @@ +package openClosedPrinciples.core; + +import java.time.LocalDate; + +/** + * Classe Utilitaire + * + * + * @author Mireille Blay-Fornarino + * + * + * 6 oct. 2018 + */ +public final class DateTools { + + + private DateTools() { + throw new IllegalStateException("Utility class"); + } + + public static LocalDate addDays(LocalDate date, int nbJour) { + return date.plusDays(nbJour); + } + + public static LocalDate[] getDays(LocalDate date, int nbJour) { + int i = 0; + LocalDate[] dates = new LocalDate[nbJour]; + dates[i] = date; + i+=1; + while (i < nbJour) { + dates[i] = addDays(date,i); + i++; + } + return dates; + } + +} diff --git a/src/openClosedPrinciples/core/Description.java b/src/openClosedPrinciples/core/Description.java new file mode 100644 index 0000000..e80d126 --- /dev/null +++ b/src/openClosedPrinciples/core/Description.java @@ -0,0 +1,68 @@ +package openClosedPrinciples.core; + +import java.time.LocalDate; +import java.util.Date; + +public class Description { + private String depart; + private String destination; + private LocalDate dateDepart; + private int duree; + + + /// Constructeurs + + // Vide + public Description() { + depart = null; + destination = null; + dateDepart = null; + duree = 0; + } + + // Avec tout rempli + public Description(String depart, String destination, LocalDate dateDepart, int duree) { + this.depart = depart; + this.destination = destination; + this.dateDepart = dateDepart; + this.duree = duree; + } + + + /// Accesseurs et mutateurs + + public String getDestination() { + return destination; + } + + public void setDestination(String destination) { + this.destination = destination; + } + + public String getDepart() { + return depart; + } + + public void setDepart(String depart) { + this.depart = depart; + } + + public LocalDate getDateDepart() { + return dateDepart; + } + + public void setDateDepart(LocalDate dateDepart) { + this.dateDepart = dateDepart; + } + + public int getDuree() { + return duree; + } + + public void setDuree(int duree) { + this.duree = duree; + } + + + +} diff --git a/src/openClosedPrinciples/core/Flight.java b/src/openClosedPrinciples/core/Flight.java new file mode 100644 index 0000000..c75fd21 --- /dev/null +++ b/src/openClosedPrinciples/core/Flight.java @@ -0,0 +1,92 @@ +package openClosedPrinciples.core; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.Random; + +/** + * @author Mireille Blay-Fornarino + * + * 6 oct. 2018 + */ +public class Flight extends PayingItem { + private LocalDate departDate; + private String departAirport; + private String arrivalAirport; + private LocalTime departTime; + + + /// Constructeurs + + public Flight(String departAirport) { + this(-1, LocalDate.now(), LocalTime.now(), departAirport, "Paris"); + } + + public Flight(double price, LocalDate departDate, LocalTime departTime, String departAirport, String arrivalAirport) { + super(price); + this.departDate = departDate; + this.departAirport = departAirport; + this.arrivalAirport = arrivalAirport; + this.departTime= departTime; + } + + + /// Accesseurs et mutateurs + + public LocalTime getDepartTime() { + return departTime; + } + public void setDepartTime(LocalTime departTime) { + this.departTime = departTime; + } + public LocalDate getDepartDate() { + return departDate; + } + public void setDepartDate(LocalDate departDate) { + this.departDate = departDate; + } + + public String getDepartAirport() { + return departAirport; + } + public void setDepartAirport(String departAirport) { + this.departAirport = departAirport; + } + + public String getArrivalAirport() { + return arrivalAirport; + } + public void setArrivalAirport(String arrivalAirport) { + this.arrivalAirport = arrivalAirport; + } + + public void setPrice(double price) { + super.setPrice(price); + } + + public double getPrice() { + if (super.price == -1) { + double start = 10; + double end = 1000; + double random = new Random().nextDouble(); + super.setPrice(start + (random * (end - start))); + } + return super.price; + } + + + /// Méthodes + + // On voit si le vol correspond à celui entré en paramètres + public boolean match(LocalDate d, String from, String to) { + return getDepartDate().equals(d) && getDepartAirport().equals(from) && getArrivalAirport().equals(to); + } + + + // Affichage + @Override + public String toString() { + return "Flight [price=" + super.toString() + ", departDate=" + departDate + ", departAirport=" + departAirport + + ", arrivalAirport=" + arrivalAirport + ", departTime=" + departTime + "]"; + } +} diff --git a/src/openClosedPrinciples/core/FlightService.java b/src/openClosedPrinciples/core/FlightService.java new file mode 100644 index 0000000..7f1daa2 --- /dev/null +++ b/src/openClosedPrinciples/core/FlightService.java @@ -0,0 +1,50 @@ +package openClosedPrinciples.core; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author Mireille Blay-Fornarino + * + * 6 oct. 2018 + */ +public class FlightService extends Service { + + /// Constructeurs + + public FlightService(ArrayList flights) { + super(flights); + } + + + /// Méthodes + + // Récupérer les vols de cette date + public List getFlights(LocalDate d) { + Stream parallelStream = super.getpayingItemList().parallelStream(); + Stream results = parallelStream.filter(f -> (f.getDepartDate().equals(d)) ) ; + return results.collect(Collectors.toCollection(ArrayList::new)); + } + + // Récupérer les vols de cette date + lieux départ et destination + public ArrayList getFlights(LocalDate d, String from, String to) { + Stream parallelStream = super.getpayingItemList().parallelStream(); + Stream results = parallelStream.filter(f -> + f.match(d, from, to)) ; + return results.collect(Collectors.toCollection(ArrayList::new)); + } + + // Recherche d'un vol correspondant à la description + public Flight find(Description description) { + ArrayList listeVols = this.getFlights(description.getDateDepart(), description.getDepart(), description.getDestination()); + listeVols.sort(Comparator.comparing(Flight::getPrice)); + if(listeVols.isEmpty()) { + return null; + } + return listeVols.get(0); + } +} diff --git a/src/openClosedPrinciples/core/GestionnaireVoyages.java b/src/openClosedPrinciples/core/GestionnaireVoyages.java new file mode 100644 index 0000000..e8e2e89 --- /dev/null +++ b/src/openClosedPrinciples/core/GestionnaireVoyages.java @@ -0,0 +1,112 @@ +package openClosedPrinciples.core; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.Month; +import java.util.ArrayList; +import java.util.Scanner; + +public class GestionnaireVoyages { + private static TravelOrganizer to = new TravelOrganizer(); + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + + //// GESTION DU VOYAGE CHOISI PAR L'UTILISATEUR + + /// On récupère le départ + System.out.println("De où partez-vous ?"); + String depart = sc.nextLine(); + + /// On récupère la destination + System.out.println("Où voulez-vous aller ?"); + String destination = sc.nextLine(); + + /// On récupère la durée du voyage + System.out.println("Combien de temps voulez-vous partir?"); + int duree = Integer.parseInt(sc.nextLine()); + + //Date (non demandée par l'utilisateur) + LocalDate ld = LocalDate.of(2019, Month.OCTOBER, 18); + + //Date pour tester + LocalDate ldr = LocalDate.of(2019, Month.JUNE, 18); + LocalTime lt = LocalTime.now(); + + //Description du voyage de l'utilisateur + Description d = new Description(depart, destination, ld, duree); + + /// GESTION DES VOLS + + // Première compagnie de vols + Flight f1 = new Flight(350, ld, lt, depart, destination); + Flight f2 = new Flight(100, ld, lt, depart, destination); // moins cher + Flight f3 = new Flight(56, ld, lt, "Cannes", destination); // n'a pas le bon départ + ArrayList flights1 = new ArrayList<>(); + flights1.add(f1); + flights1.add(f2); + flights1.add(f3); + FlightService fs1 = new FlightService(flights1); + to.addAirlineCompany(fs1); + + // Deuxième compagnie de vols + Flight f4 = new Flight(20, ld, lt, depart, "Tokyo"); // n'a pas la bonne destination + Flight f5 = new Flight(22, ldr, lt, depart, destination); // n'a pas la bonne date + ArrayList flights2 = new ArrayList<>(); + flights2.add(f4); + flights2.add(f5); + FlightService fs2 = new FlightService(flights2); + to.addAirlineCompany(fs2); + + + + /// GESTION DES LOCATIONS DE VOITURES + + // Première compagnie qui contiendra 3 voitures + Car c1 = new Car("111", 10); //sera réservée plus tard + Car c2 = new Car("222", 15); + Car c3 = new Car("333", 30); //sera réservée plus tard + ArrayList cs1 = new ArrayList<>(); + cs1.add(c1); + cs1.add(c2); + cs1.add(c3); + CarRentalService crs1 = new CarRentalService(cs1); + to.addCarRentCompany(crs1); + + // Deuxième compagnie qui contiendra 2 voitures S + Car c4 = new Car("444", 4); //voiture la moins chère, mais sera réservée plus tard + Car c5 = new Car("555", 50); + ArrayList cs2 = new ArrayList<>(); + cs2.add(c4); + cs2.add(c5); + CarRentalService crs2 = new CarRentalService(cs2); + to.addCarRentCompany(crs2); + + + try { + // On réserve 3 voitures + crs1.book(c1, ld, duree); + crs1.book(c3, ld, duree); + crs2.book(c4, ld, duree); + } catch (NotPossibleCarRentalException e) { + System.out.println(e.getMessage()); + } + + + try { + Trip voyageChoisi = to.createATrip(d); + + //Affichage du meilleur vol + System.out.println("Le meilleur vol pour partir de "+ depart +" et arriver à " + destination + + " le 18/10/2019 est : \n\t" + voyageChoisi.getItems().get(0)); + + //Affichage de la meilleure location de voiture + System.out.println("La meilleure voiture à louer pour une durée de " + duree + + " jours à partir du " + ld +" est : \n\t" + voyageChoisi.getItems().get(1)); + } catch(AucunItemCorrespondant e) { + System.out.println(e.getMessage()); + } + + + } +} diff --git a/src/openClosedPrinciples/core/NotPossibleCarRentalException.java b/src/openClosedPrinciples/core/NotPossibleCarRentalException.java new file mode 100644 index 0000000..752cb20 --- /dev/null +++ b/src/openClosedPrinciples/core/NotPossibleCarRentalException.java @@ -0,0 +1,19 @@ +package openClosedPrinciples.core; + +/** + * @author Mireille Blay-Fornarino + * + * 6 oct. 2018 + */ +public class NotPossibleCarRentalException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public NotPossibleCarRentalException(String message) { + super(message); + } + +} diff --git a/src/openClosedPrinciples/core/PayingItem.java b/src/openClosedPrinciples/core/PayingItem.java new file mode 100644 index 0000000..abf7fbd --- /dev/null +++ b/src/openClosedPrinciples/core/PayingItem.java @@ -0,0 +1,30 @@ +package openClosedPrinciples.core; + +public abstract class PayingItem { + protected double price; + + /// Constructeurs + + public PayingItem(double price) { + this.price = price; + } + + + /// Accesseurs et mutateurs + + // Méthode abstraite parce que le calcul du prix n'est pas le même pour une voiture et pour une vol + public abstract double getPrice(); + + public void setPrice(double price) { + this.price = price; + } + + + /// Méthodes + + // Affichage + @Override + public String toString() { + return "" + price; + } +} diff --git a/src/openClosedPrinciples/core/Service.java b/src/openClosedPrinciples/core/Service.java new file mode 100644 index 0000000..bc8435d --- /dev/null +++ b/src/openClosedPrinciples/core/Service.java @@ -0,0 +1,46 @@ +package openClosedPrinciples.core; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public abstract class Service{ + protected List payingItemList = new ArrayList<>(); + + /// Constructeurs + + public Service(List payingItemList) { + this.payingItemList = payingItemList; + } + + + /// Accesseur + + protected List getpayingItemList(){ + return payingItemList; + } + + + /// Méthodes + + // Trier la liste d'item par prix + public List sortedByPrice() { + payingItemList.sort(Comparator.comparing(PayingItem::getPrice)); + return payingItemList; + } + + // Récupérer l'item le moins cher + public T lessExpensiveItem(){ + sortedByPrice(); + return payingItemList.get(0); + } + + // Ajouter un item à la liste + public void add(T payingItem) { + payingItemList.add(payingItem); + } + + // Trouver + public abstract T find(Description description) throws AucunItemCorrespondant; + +} diff --git a/src/openClosedPrinciples/core/TravelOrganizer.java b/src/openClosedPrinciples/core/TravelOrganizer.java new file mode 100644 index 0000000..c02cd0f --- /dev/null +++ b/src/openClosedPrinciples/core/TravelOrganizer.java @@ -0,0 +1,99 @@ +package openClosedPrinciples.core; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.Month; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Scanner; + +public class TravelOrganizer { + List airlinesCompanies; + List carRentCompanies; + + /// Constructeurs + + public TravelOrganizer() { + airlinesCompanies = new ArrayList<>(); + carRentCompanies = new ArrayList<>(); + } + + + /// Accesseurs et mutateurs + + public List getAirlinesCompanies() { + return airlinesCompanies; + } + + public void setAirlinesCompanies(List airlinesCompanies) { + this.airlinesCompanies = airlinesCompanies; + } + + + public List getCarRentCompanies() { + return carRentCompanies; + } + + + public void setCarRentCompanies(List carRentCompanies) { + this.carRentCompanies = carRentCompanies; + } + + + /// Méthodes + + // Ajouter une compagnie aérienne + public void addAirlineCompany(FlightService company) { + airlinesCompanies.add(company); + } + + // Ajouter une compagnie de location de voitures + public void addCarRentCompany(CarRentalService company) { + carRentCompanies.add(company); + } + + // Créer un voyage + public Trip createATrip(Description description) throws AucunItemCorrespondant { + Trip t = new Trip(description); + Flight f = this.findFlight(description); + CarRental cr = this.findCar(description); + if(f!=null && cr!=null) { + t.addItem(f); + t.addItem(cr); + }else { + throw new AucunItemCorrespondant("Aucun voyage ne correspond aux critères recherchés."); + } + return t; + } + + // Recherche un vol + public Flight findFlight(Description description) throws AucunItemCorrespondant { + List flights = new ArrayList(); + for(FlightService fs : airlinesCompanies) { + Flight f = fs.find(description); + if(f != null) + flights.add(f); + } + flights.sort(Comparator.comparing(Flight::getPrice)); + if(flights.isEmpty()) { + throw new AucunItemCorrespondant("Aucun vol correspondant à votre recherche."); + } + return flights.get(0); + } + + // Recherche une voiture + public CarRental findCar(Description description) throws AucunItemCorrespondant { + List cars = new ArrayList(); + for(CarRentalService c : carRentCompanies) { + CarRental cr = c.find(description); + if(cr!=null) + cars.add(cr); + } + cars.sort(Comparator.comparing(CarRental::getPrice)); + if(cars.isEmpty()) { + throw new AucunItemCorrespondant("Aucune location de voiture correspondant à votre recherche."); + } + return cars.get(0); + } +} diff --git a/src/openClosedPrinciples/core/Trip.java b/src/openClosedPrinciples/core/Trip.java new file mode 100644 index 0000000..cc9e6a4 --- /dev/null +++ b/src/openClosedPrinciples/core/Trip.java @@ -0,0 +1,49 @@ +package openClosedPrinciples.core; + +import java.util.ArrayList; +import java.util.List; + +public class Trip { + private Description description; + private List items; + + /// Constructeurs + + // Vide + public Trip() { + description = null; + items = new ArrayList(); + } + + // Avec la description + public Trip(Description description) { + this.description = description; + items = new ArrayList(); + } + + + /// Accesseurs et mutateurs + + public Description getDescription() { + return description; + } + + public void setDescription(Description description) { + this.description = description; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + + /// Méthodes + + public void addItem(PayingItem item) { + items.add(item); + } +} diff --git a/src/td5/p1/Launch.java b/src/td5/p1/Launch.java new file mode 100644 index 0000000..21ba10c --- /dev/null +++ b/src/td5/p1/Launch.java @@ -0,0 +1,26 @@ +package td5.p1; + +import td5.p1.personnage.Orc; +import td5.p1.personnage.Tauren; + +public class Launch { + + public static void main(String[] args) { + + Tauren diablon = new Tauren("Diablon", 15); + Orc azag = new Orc("Azag", 5); + + diablon.attack(azag); + azag.attack(diablon); + + azag.setHp(15); + + System.out.println(azag.getState()); + System.out.println(diablon.getState()); + + + + } + + +} diff --git a/src/td5/p1/ModernWeaponFactory.java b/src/td5/p1/ModernWeaponFactory.java new file mode 100644 index 0000000..992bebe --- /dev/null +++ b/src/td5/p1/ModernWeaponFactory.java @@ -0,0 +1,37 @@ +package td5.p1; + +import td5.p1.arme.*; + +public class ModernWeaponFactory extends WeaponFactory { + + public ModernWeaponFactory() { + super(); + } + + public Arme createWeapon(String t, String n) { + Arme a; + switch (t) { + case "Epee": + a = new Epée(n); + break; + case "Dague": + a = new Dague(n); + break; + case "Bouclier": + a = new Bouclier(n); + break; + case "Fusil": + a = new Fusil(n); + break; + default: + a = null; + break; + } + super.ajoute(a); + return a; + } + + public Arme getWeapon(String n) { + return super.getWeapon(n); + } +} diff --git a/src/td5/p1/WeaponFactory.java b/src/td5/p1/WeaponFactory.java new file mode 100644 index 0000000..e8c0809 --- /dev/null +++ b/src/td5/p1/WeaponFactory.java @@ -0,0 +1,74 @@ +package td5.p1; + +import java.util.ArrayList; + +import td5.p1.arme.*; + +public class WeaponFactory { + + private static ArrayList l = new ArrayList(); + + public WeaponFactory() { + Arme d = new Arme("Arme1"); + l.add(d); + } + + public Arme createWeapon(String t, String n) { + Arme a; + switch (t) { + case "SWORD": + a = new Epée(n); + break; + case "DAG": + a = new Dague(n); + break; + case "SHIELD": + a = new Bouclier(n); + break; + default: + a = new Arme(n); + break; + } + l.add(a); + return a; + } + + public Arme getWeapon(String n) { + boolean trouve = false; + int i = 0; + + if (l.isEmpty()) { + return null; + } else { + while (!trouve) { + l.get(i); + if (i < l.size()) { + if (l.get(i).getNom().equals(n)) { + trouve = true; + return l.get(i); + } + i++; + } else { + return null; + } + + } + } + return null; + } + + // ========================================================================== + + public ArrayList getL() { + return l; + } + + public void setL(ArrayList l) { + this.l = l; + } + + public void ajoute(Arme a) { + l.add(a); + } + +} diff --git a/src/td5/p1/arme/Arme.java b/src/td5/p1/arme/Arme.java new file mode 100644 index 0000000..f06bce0 --- /dev/null +++ b/src/td5/p1/arme/Arme.java @@ -0,0 +1,74 @@ +package td5.p1.arme; + +public class Arme { + + private int force; + private int protection; + private String nom; + + public Arme() { + this(0, 0, null); + } + + public Arme(String n) { + this(0, 0, n); + } + + public Arme(int f, int p, String n) { + this.setForce(f); + this.setProtection(p); + this.setNom(n); + } + + @Override + public String toString() { + return this.nom; + } + + public int getForce() { + return force; + } + + public void setForce(int force) { + this.force = force; + } + + public int getProtection() { + return protection; + } + + public void setProtection(int protection) { + this.protection = protection; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Arme other = (Arme) obj; + if (force != other.force) + return false; + if (nom == null) { + if (other.nom != null) + return false; + } else if (!nom.equals(other.nom)) + return false; + if (protection != other.protection) + return false; + return true; + } + +} diff --git a/src/td5/p1/arme/Bouclier.java b/src/td5/p1/arme/Bouclier.java new file mode 100644 index 0000000..fd528a8 --- /dev/null +++ b/src/td5/p1/arme/Bouclier.java @@ -0,0 +1,14 @@ +package td5.p1.arme; + +public class Bouclier extends Arme { + + public Bouclier() { + this("Bouclier"); + } + + public Bouclier(String n) { + super(5, 20, n); + } + + +} diff --git a/src/td5/p1/arme/Dague.java b/src/td5/p1/arme/Dague.java new file mode 100644 index 0000000..499d768 --- /dev/null +++ b/src/td5/p1/arme/Dague.java @@ -0,0 +1,13 @@ +package td5.p1.arme; + +public class Dague extends Arme { + + public Dague() { + this("Dague"); + } + + public Dague(String n) { + super(20, 10, n); + } + +} diff --git a/src/td5/p1/arme/Epée.java b/src/td5/p1/arme/Epée.java new file mode 100644 index 0000000..1a7e5ed --- /dev/null +++ b/src/td5/p1/arme/Epée.java @@ -0,0 +1,13 @@ +package td5.p1.arme; + +public class Epée extends Arme { + + public Epée() { + this("Epée"); + } + + public Epée(String n) { + super(25, 5, n); + } + +} diff --git a/src/td5/p1/arme/Fusil.java b/src/td5/p1/arme/Fusil.java new file mode 100644 index 0000000..6a866ce --- /dev/null +++ b/src/td5/p1/arme/Fusil.java @@ -0,0 +1,14 @@ +package td5.p1.arme; + +public class Fusil extends Arme { + + public Fusil() { + this("Fusil"); + } + + public Fusil(String n) { + super(30, 1, n); + } + + +} diff --git a/src/td5/p1/etat/Faible.java b/src/td5/p1/etat/Faible.java new file mode 100644 index 0000000..3d7a8be --- /dev/null +++ b/src/td5/p1/etat/Faible.java @@ -0,0 +1,24 @@ +package td5.p1.etat; + +import td5.p1.personnage.Personnage; + +public class Faible extends PlayerState { + + public Faible(Personnage p) { + super(p); + } + + public void attack(Personnage p) { + int damage = player.getWeapon().getForce() - p.getWeapon().getProtection() - (1 - 1/p.getHp()); + + if(damage != 0) { + System.out.print(player.getNom() + player.vie() + " a attaqué " + p.getNom() + p.vie() + "."); + p.getDamage(damage); + System.out.println(" " + p.getNom() + " a perdu " + damage + " HP" + p.vie() + "!"); + } else { + System.out.println(player.getNom() + " a attaqué " + p.getNom() + ". " + p.getNom() + " n'a pris aucun dégats."); + } + + } + +} diff --git a/src/td5/p1/etat/Mort.java b/src/td5/p1/etat/Mort.java new file mode 100644 index 0000000..71411b0 --- /dev/null +++ b/src/td5/p1/etat/Mort.java @@ -0,0 +1,17 @@ +package td5.p1.etat; + +import td5.p1.personnage.Personnage; + +public class Mort extends PlayerState { + + public Mort(Personnage p) { + super(p); + } + + public void attack(Personnage p) { + + } + + + +} diff --git a/src/td5/p1/etat/PlayerState.java b/src/td5/p1/etat/PlayerState.java new file mode 100644 index 0000000..c10bb10 --- /dev/null +++ b/src/td5/p1/etat/PlayerState.java @@ -0,0 +1,41 @@ +package td5.p1.etat; + +import td5.p1.personnage.Personnage; + +public class PlayerState { + + protected Personnage player; + + public PlayerState(Personnage p) { + this.player = p; + } + + public void attack(Personnage p) { + + } + + public void checkState(Personnage p) { + checkAlive(p); + checkFaible(p); + checkMort(p); + } + + protected static void checkMort(Personnage p) { + if(p.getHp() <= 0 ) { + p.setState(new Mort(p)); + } + } + + protected static void checkFaible(Personnage p) { + if((p.getHp() <= 25) && (p.getHp() > 0)) { + p.setState(new Faible(p)); + } + } + + protected static void checkAlive(Personnage p) { + if(p.getHp() >= 25) { + p.setState(new Vivant(p)); + } + } + +} diff --git a/src/td5/p1/etat/Vivant.java b/src/td5/p1/etat/Vivant.java new file mode 100644 index 0000000..f5113de --- /dev/null +++ b/src/td5/p1/etat/Vivant.java @@ -0,0 +1,24 @@ +package td5.p1.etat; + +import td5.p1.personnage.Personnage; + +public class Vivant extends PlayerState { + + public Vivant(Personnage p) { + super(p); + } + + public void attack(Personnage p) { + int damage = player.getWeapon().getForce() - p.getWeapon().getProtection(); + + if(damage != 0) { + System.out.print(player.getNom() + player.vie() + " a attaqué " + p.getNom() + p.vie() + "."); + p.getDamage(damage); + System.out.println(" " + p.getNom() + " a perdu " + damage + " HP" + p.vie() + "!"); + } else { + System.out.println(player.getNom() + " a attaqué " + p.getNom() + ". " + p.getNom() + " n'a pris aucun dégats."); + } + + } + +} diff --git a/src/td5/p1/personnage/Humain.java b/src/td5/p1/personnage/Humain.java new file mode 100644 index 0000000..a3ddf9e --- /dev/null +++ b/src/td5/p1/personnage/Humain.java @@ -0,0 +1,27 @@ +package td5.p1.personnage; + +import td5.p1.arme.Epée; + +public class Humain extends Personnage { + + private String eyeColor; + + public Humain() { + this(null, null); + } + + public Humain(String n, String c) { + super(n); + this.setEyeColor(c); + super.setWeapon(new Epée()); + } + + public String getEyeColor() { + return this.eyeColor; + } + + public void setEyeColor(String eyeColor) { + this.eyeColor = eyeColor; + } + +} diff --git a/src/td5/p1/personnage/Orc.java b/src/td5/p1/personnage/Orc.java new file mode 100644 index 0000000..3060975 --- /dev/null +++ b/src/td5/p1/personnage/Orc.java @@ -0,0 +1,27 @@ +package td5.p1.personnage; + +import td5.p1.arme.Epée; + +public class Orc extends Personnage { + + private int earSize; + + public Orc() { + this(null, 0); + } + + public Orc(String n, int e) { + super(n); + this.setEarSize(e);; + super.setWeapon(new Epée()); + } + + public int getEarSize() { + return earSize; + } + + public void setEarSize(int earSize) { + this.earSize = earSize; + } + +} diff --git a/src/td5/p1/personnage/Personnage.java b/src/td5/p1/personnage/Personnage.java new file mode 100644 index 0000000..2168792 --- /dev/null +++ b/src/td5/p1/personnage/Personnage.java @@ -0,0 +1,86 @@ +package td5.p1.personnage; + +import td5.p1.arme.Arme; +import td5.p1.etat.*; + +public class Personnage { + + private int hp; + + private String nom; + private Arme weapon; + private PlayerState state = new Vivant(this); + + public Personnage() { + this("DefaultCharater"); + } + + public Personnage(String n) { + this.setNom(n); + this.setHp(100); + } + + public void attack(Personnage p) { + /** + * int damage = this.getWeapon().getForce() - p.getWeapon().getProtection(); + + if(damage != 0) { + System.out.print(this.getNom() + this.vie() + " a attaqué " + p.getNom() + p.vie() + "."); + p.getDamage(damage); + System.out.println(" " + p.getNom() + " a perdu " + damage + " HP" + p.vie() + "!"); + } else { + System.out.println(this.getNom() + " a attaqué " + p.getNom() + ". " + p.getNom() + " n'a pris aucun dégats."); + } + + */ + + + } + + public void getDamage(int a) { + this.setHp(this.hp - a); + } + + public String vie() { + return " (" + this.getHp() + "/100 HP)"; + } + + //====================================================================================================== + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public int getHp() { + return hp; + } + + public void setHp(int hp) { + this.hp = hp; + } + + public Arme getWeapon() { + return weapon; + } + + public void setWeapon(Arme weapon) { + this.weapon = weapon; + } + + public Object getArme() { + return this.getWeapon(); + } + + public PlayerState getState() { + return state; + } + + public void setState(PlayerState s) { + this.state = s; + } + +} diff --git a/src/td5/p1/personnage/Tauren.java b/src/td5/p1/personnage/Tauren.java new file mode 100644 index 0000000..59b0e02 --- /dev/null +++ b/src/td5/p1/personnage/Tauren.java @@ -0,0 +1,26 @@ +package td5.p1.personnage; + +import td5.p1.arme.Bouclier; + +public class Tauren extends Personnage { + + private int hornSize; + + public Tauren() { + this(null, 0); + } + + public Tauren(String n, int c) { + super(n); + this.setHornSize(c); + super.setWeapon(new Bouclier()); + } + + public int getHornSize() { + return hornSize; + } + + public void setHornSize(int hornSize) { + this.hornSize = hornSize; + } +} diff --git a/src/td5/p1/personnage/Troll.java b/src/td5/p1/personnage/Troll.java new file mode 100644 index 0000000..bb2eb05 --- /dev/null +++ b/src/td5/p1/personnage/Troll.java @@ -0,0 +1,26 @@ +package td5.p1.personnage; + +import td5.p1.arme.Dague; + +public class Troll extends Personnage { + + private String favouriteBeer; + + public Troll() { + this(null, null); + } + + public Troll(String n, String b) { + super(n); + this.setFavouriteBeer(b); + super.setWeapon(new Dague()); + } + + public String getFavouriteBeer() { + return favouriteBeer; + } + + public void setFavouriteBeer(String favouriteBeer) { + this.favouriteBeer = favouriteBeer; + } +} diff --git a/src/td5/p1/td5p1.png b/src/td5/p1/td5p1.png new file mode 100644 index 0000000000000000000000000000000000000000..b863fc4782ae164f5ee26261557b62ae4c4f2270 GIT binary patch literal 88597 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.asList(myCar0, myCar1, myCar2) ) ) ; + + } + + @Test + public void testGetAvailableCars() { + ArrayList possibleCars = + (ArrayList) service.getAvailableCars(LocalDate.of(2018,9,11), 2); + assertEquals(3, possibleCars.size()); + } + + + @Test + public void testBookAnAvalaibleCar() throws NotPossibleCarRentalException { + CarRental carRental = service.book(myCar0,LocalDate.of(2018,9,11), 2); + assertFalse(carRental==null); + List possibleCars = service.getAvailableCars(LocalDate.of(2018,9,11), 1); + assertEquals(2, possibleCars.size()); + + possibleCars = service.getAvailableCars(LocalDate.of(2018,9,12), 3); + assertEquals(2, possibleCars.size()); + + possibleCars = service.getAvailableCars(LocalDate.of(2018,9,13), 3); + assertEquals(3, possibleCars.size()); + + possibleCars = service.getAvailableCars(LocalDate.of(2018,9,9), 4); + assertEquals(2, possibleCars.size()); + + possibleCars = service.getAvailableCars(LocalDate.of(2018,9,19), 7); + assertEquals(3, possibleCars.size()); + + } + + + @Test + public void testBookANonAvalaibleCar() throws NotPossibleCarRentalException { + CarRental carRental = service.book(myCar0,LocalDate.of(2017,9,11), 2); + assertFalse(carRental==null); + carRental = service.book(myCar0,LocalDate.of(2017,9,12), 2); + assertTrue(carRental==null); + } + + @Test + public void testGetNotAvailableCars() throws NotPossibleCarRentalException { + service.book(myCar0,LocalDate.of(2017,9,11), 2); + List possibleCars = service.getAvailableCars(LocalDate.of(2017,9,11), 2); + assertEquals(2, possibleCars.size()); + possibleCars = service.getAvailableCars(LocalDate.of(2017,9,12), 2); + assertEquals(2, possibleCars.size()); + possibleCars = service.getAvailableCars(LocalDate.of(2017,9,13), 2); + assertEquals(3, possibleCars.size()); + } + + + +} diff --git a/tests/openClosedPrinciples/core/CarRentalTest.java b/tests/openClosedPrinciples/core/CarRentalTest.java new file mode 100644 index 0000000..876cad1 --- /dev/null +++ b/tests/openClosedPrinciples/core/CarRentalTest.java @@ -0,0 +1,61 @@ +package openClosedPrinciples.core; +import static org.junit.jupiter.api.Assertions.*; + +import java.time.LocalDate; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import openClosedPrinciples.core.Car; +import openClosedPrinciples.core.CarRental; +import openClosedPrinciples.core.DateTools; + + +class CarRentalTest { + + Car myCar = new Car("1111 AB 06",50); + CarRental carRental; + + @BeforeEach + public void setUp() throws Exception { + myCar = new Car("1111 AB 06",50); + } + + + @Test + public void testCarRental() { + carRental = new CarRental(myCar, LocalDate.of(2018, 8, 30), 3); + assertEquals( myCar.getDayPrice()*3, carRental.getPrice()); + } + + @Test + public void testCarRentalAvailability() { + carRental = new CarRental(myCar, LocalDate.of(2018, 8, 30), 3); + LocalDate[] dates = DateTools.getDays(LocalDate.of(2018, 8, 30), 3); + assertEquals(3, dates.length ); + dates = DateTools.getDays(LocalDate.of(2018, 8, 30), 1); + assertTrue(carRental.includeADate(dates),"date de début OK"); + + dates = DateTools.getDays(LocalDate.of(2018, 8, 29), 1); + assertFalse(carRental.includeADate(dates),"date à un jour avant"); + + dates = DateTools.getDays(LocalDate.of(2018, 9, 2), 1); + assertFalse(carRental.includeADate(dates),"date à un jour après"); + + dates = DateTools.getDays(LocalDate.of(2018, 8, 25), 10); + assertTrue(carRental.includeADate(dates),"date incluse après"); + + dates = DateTools.getDays(LocalDate.of(2018, 9, 1), 1); + assertTrue(carRental.includeADate(dates),"date incluse sur la fin"); + dates = DateTools.getDays(LocalDate.of(2018, 8, 31), 10); + assertTrue(carRental.includeADate(dates),"date incluse sur la fin"); + } + + @Test + public void testGetPrice() { + carRental = new CarRental(myCar, LocalDate.of(2017, 8, 31), 3); + assertEquals(50,myCar.getDayPrice()); + assertEquals(50*3,carRental.getPrice()); + } + +} diff --git a/tests/openClosedPrinciples/core/FlightServiceTest.java b/tests/openClosedPrinciples/core/FlightServiceTest.java new file mode 100644 index 0000000..bf0b9c6 --- /dev/null +++ b/tests/openClosedPrinciples/core/FlightServiceTest.java @@ -0,0 +1,47 @@ +package openClosedPrinciples.core; + +import static org.junit.Assert.*; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import openClosedPrinciples.core.Flight; +import openClosedPrinciples.core.FlightService; + +public class FlightServiceTest { + + FlightService service ; + @Before + public void setUp() throws Exception { + ArrayList list = new ArrayList<>(); + list.add(new Flight("Belfort")); + list.add(new Flight("Nice")); + list.add(new Flight(100, LocalDate.of(2017, 12, 24), LocalTime.of(7, 45),"Nice", "Paris")); + list.add(new Flight(150, LocalDate.of(2017, 12, 24), LocalTime.of(9, 30), "Nice", "Paris")); + list.add(new Flight(150, LocalDate.of(2017, 12, 24), LocalTime.of(18, 30), "Paris", "Nice")); + service = new FlightService(list); + } + + + @Test + public void testGetFlightsOnADivenDate() { + List flights = service.getFlights(LocalDate.now()); + assertEquals(2, flights.size()); + flights = service.getFlights(LocalDate.of(2017, 12, 24)); + assertEquals(3, flights.size()); + } + + @Test + public void testGetFlights() { + List flights = service.getFlights(LocalDate.now(),"Nice","Paris"); + assertEquals(1, flights.size()); + flights = service.getFlights(LocalDate.of(2017, 12, 24),"Nice","Paris"); + assertEquals(2, flights.size()); + } + +} diff --git a/tests/openClosedPrinciples/core/FlightTest.java b/tests/openClosedPrinciples/core/FlightTest.java new file mode 100644 index 0000000..632de4d --- /dev/null +++ b/tests/openClosedPrinciples/core/FlightTest.java @@ -0,0 +1,30 @@ +package openClosedPrinciples.core; + +import static org.junit.Assert.*; + +import java.time.LocalDate; +import java.time.LocalTime; + +import org.junit.Before; +import org.junit.Test; + +import openClosedPrinciples.core.Flight; + +public class FlightTest { + + + Flight f1 = new Flight(100, LocalDate.of(2017,11,11), LocalTime.of(7, 45),"Nice","Paris"); + @Before + public void setUp() throws Exception { + } + + + @Test + public void testGetPrice() { + assertEquals(100,f1.getPrice(),0); + f1.setPrice(-1); + assertTrue(f1.getPrice()>=10); + assertTrue(f1.getPrice()<=1000); + } + +} diff --git a/tests/td5/p1/testArmes.java b/tests/td5/p1/testArmes.java new file mode 100644 index 0000000..fb663d4 --- /dev/null +++ b/tests/td5/p1/testArmes.java @@ -0,0 +1,61 @@ +package td5.p1; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +import td5.p1.arme.Arme; +import td5.p1.personnage.Orc; +import td5.p1.personnage.Personnage; +import td5.p1.personnage.Tauren; + +public class testArmes { + + @Test + public void test1() { + Tauren diablon = new Tauren("Diablon", 15); + Orc azag = new Orc("Azag", 5); + + diablon.attack(azag); + azag.attack(diablon); + assertEquals(100, azag.getHp()); + assertEquals(95, diablon.getHp()); + } + + @Test + public void test2() { + WeaponFactory wf = new WeaponFactory(); + Arme w = wf.createWeapon("SWORD", "excalibur"); + Arme w1 = wf.getWeapon("excalibur"); + assertEquals(w, w1); + Personnage azag = new Orc("Azag", 5); + try { + assertEquals(Class.forName("td5.p1.arme.Epée"), azag.getArme().getClass()); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + + @Test + public void test3() { + WeaponFactory wp = new WeaponFactory(); + WeaponFactory wp2 = new ModernWeaponFactory(); + String nom = "Ref"; + int i = 0; + Arme a1 = wp.createWeapon("SWORD", nom + i); + i++; + Arme a2 = wp2.createWeapon("Dague", nom + i); + i++; + Arme a3 = wp2.createWeapon("Fusil", nom + i); + i++; + Arme a4 = wp2.createWeapon("Missil", nom + i); // Type non reconnu + assertTrue(a1 != null); + assertTrue(a2 != null); + assertTrue(a3 != null); + assertTrue(a4 == null); + assertEquals(a1, wp.getWeapon(nom + 0)); // On retrouve une arme créée par un autre + assertEquals(a3, wp.getWeapon(nom + 2)); + } + +}