From b947a28b430bbcabd6dd66196d2b9fefada2a852 Mon Sep 17 00:00:00 2001 From: Luca Conte Date: Sat, 25 Nov 2023 23:11:10 +0100 Subject: [PATCH] finish up bonus-1 --- bonus-1/.classpath | 4 +- bonus-1/schema-and-data.sql | 135 +++++++ bonus-1/sqlite-test.db | Bin 45056 -> 53248 bytes bonus-1/src/.DS_Store | Bin 0 -> 6148 bytes bonus-1/src/Main.java | 48 --- bonus-1/src/de/.DS_Store | Bin 0 -> 6148 bytes bonus-1/src/de/hsh/.DS_Store | Bin 0 -> 6148 bytes bonus-1/src/de/hsh/dbs2/.DS_Store | Bin 0 -> 6148 bytes bonus-1/src/de/hsh/dbs2/imdb/Starter.java | 31 ++ .../de/hsh/dbs2/imdb/gui/CharacterDialog.java | 232 ++++++++++++ .../imdb/gui/CharacterDialogCallback.java | 23 ++ .../src/de/hsh/dbs2/imdb/gui/MovieDialog.java | 351 ++++++++++++++++++ .../dbs2/imdb/gui/MovieDialogCallback.java | 35 ++ .../hsh/dbs2/imdb/gui/SearchMovieDialog.java | 192 ++++++++++ .../imdb/gui/SearchMovieDialogCallback.java | 83 +++++ .../de/hsh/dbs2/imdb/gui/ShowErrorDialog.java | 77 ++++ .../hsh/dbs2/imdb/gui/TabModelCharacter.java | 82 ++++ .../de/hsh/dbs2/imdb/gui/TabModelMovie.java | 89 +++++ .../de/hsh/dbs2/imdb/gui/TabModelPerson.java | 78 ++++ .../de/hsh/dbs2/imdb/logic/GenreManager.java | 35 ++ .../de/hsh/dbs2/imdb/logic/MovieManager.java | 181 +++++++++ .../de/hsh/dbs2/imdb/logic/PersonManager.java | 37 ++ .../hsh/dbs2/imdb/logic/dto/CharacterDTO.java | 45 +++ .../de/hsh/dbs2/imdb/logic/dto/MovieDTO.java | 69 ++++ .../hsh/dbs2/imdb/records}/ActiveRecord.java | 1 + .../dbs2/imdb/records}/ConnectionManager.java | 23 +- .../src/de/hsh/dbs2/imdb/records/Counter.java | 51 +++ .../{ => de/hsh/dbs2/imdb/records}/Genre.java | 32 +- .../src/de/hsh/dbs2/imdb/records/Main.java | 8 + .../{ => de/hsh/dbs2/imdb/records}/Movie.java | 25 +- .../dbs2/imdb/records}/MovieCharacter.java | 39 +- .../hsh/dbs2/imdb/records}/MovieGenre.java | 9 + .../hsh/dbs2/imdb/records}/Person.java | 32 +- .../de/hsh/dbs2/imdb/util/DBConnection.java | 28 ++ 34 files changed, 1997 insertions(+), 78 deletions(-) create mode 100644 bonus-1/schema-and-data.sql create mode 100644 bonus-1/src/.DS_Store delete mode 100644 bonus-1/src/Main.java create mode 100644 bonus-1/src/de/.DS_Store create mode 100644 bonus-1/src/de/hsh/.DS_Store create mode 100644 bonus-1/src/de/hsh/dbs2/.DS_Store create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/Starter.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/gui/CharacterDialog.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/gui/CharacterDialogCallback.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/gui/MovieDialog.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/gui/MovieDialogCallback.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/gui/SearchMovieDialog.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/gui/SearchMovieDialogCallback.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/gui/ShowErrorDialog.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/gui/TabModelCharacter.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/gui/TabModelMovie.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/gui/TabModelPerson.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/logic/GenreManager.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/logic/MovieManager.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/logic/PersonManager.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/logic/dto/CharacterDTO.java create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/logic/dto/MovieDTO.java rename bonus-1/src/{ => de/hsh/dbs2/imdb/records}/ActiveRecord.java (85%) rename bonus-1/src/{ => de/hsh/dbs2/imdb/records}/ConnectionManager.java (52%) create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/records/Counter.java rename bonus-1/src/{ => de/hsh/dbs2/imdb/records}/Genre.java (69%) create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/records/Main.java rename bonus-1/src/{ => de/hsh/dbs2/imdb/records}/Movie.java (83%) rename bonus-1/src/{ => de/hsh/dbs2/imdb/records}/MovieCharacter.java (75%) rename bonus-1/src/{ => de/hsh/dbs2/imdb/records}/MovieGenre.java (95%) rename bonus-1/src/{ => de/hsh/dbs2/imdb/records}/Person.java (71%) create mode 100644 bonus-1/src/de/hsh/dbs2/imdb/util/DBConnection.java diff --git a/bonus-1/.classpath b/bonus-1/.classpath index cb52869..be05986 100644 --- a/bonus-1/.classpath +++ b/bonus-1/.classpath @@ -6,12 +6,12 @@ - + - + diff --git a/bonus-1/schema-and-data.sql b/bonus-1/schema-and-data.sql new file mode 100644 index 0000000..1ca3efa --- /dev/null +++ b/bonus-1/schema-and-data.sql @@ -0,0 +1,135 @@ +DROP TABLE IF EXISTS MovieCharacter; +DROP TABLE IF EXISTS MovieGenre; +DROP TABLE IF EXISTS Movie; +DROP TABLE IF EXISTS Person; +DROP TABLE IF EXISTS Genre; +DROP TABLE IF EXISTS Counter; + +CREATE TABLE Person ( + PersonID LONG PRIMARY KEY, + Name VARCHAR(100), + Sex char +); + +CREATE TABLE Genre ( + GenreID LONG PRIMARY KEY, + Genre VARCHAR(100) +); + +CREATE TABLE Movie ( + MovieID LONG PRIMARY KEY, + Title VARCHAR(100), + Year INT, + Type CHAR +); +CREATE TABLE MovieGenre ( + MovieID LONG, + GenreID LONG, + PRIMARY KEY (MovieID, GenreID), + FOREIGN KEY (MovieID) + REFERENCES Movie(MovieID) + ON DELETE CASCADE, + FOREIGN KEY (GenreID) + REFERENCES Genre(GenreId) + ON DELETE CASCADE +); + +CREATE TABLE MovieCharacter ( + MovCharID LONG PRIMARY KEY, + Character VARCHAR(100), + Alias VARCHAR(100), + Position INT, + PlayedBy LONG, + MovieID LONG, + FOREIGN KEY (PlayedBy) + REFERENCES Person(PersonID) + ON DELETE CASCADE, + FOREIGN KEY (MovieID) + REFERENCES Movie(MovieID) + ON DELETE CASCADE +); + +CREATE TABLE Counter ( + TableName VARCHAR(100) PRIMARY KEY, + Counter LONG +); + +INSERT INTO `Person` VALUES + (0, 'Peter Fritz Willi Lustig', 'M'), + (1, 'Ryan Reynolds', 'M'), + (2, 'Tom Holland', 'M'), + (3, 'Robert Downey Jr', 'M'), + (4, 'Emma Watson', 'F'), + (5, 'Daniel Radcliffe', 'M'), + (6, 'Benedict Cumberbatch', 'M'), + (7, 'Martin Freeman', 'M'); + +INSERT INTO `Counter` VALUES ('Person', 8); + +INSERT INTO `Genre` VALUES + (0, 'Kinder'), + (1, 'Comedy'), + (2, 'Action'), + (3, 'Superhelden'), + (4, 'Fantasy'), + (5, 'Mystery'), + (6, 'Drama'), + (7, 'Adventure'); + +INSERT INTO `Counter` VALUES ('Genre', 8); + +INSERT INTO `Movie` VALUES + (0, 'Löwenzahn', 1981, 'S'), + (1, 'Deadpool', 2016, 'M'), + (2, 'The Proposal', 2009, 'M'), + (3, 'Spider-Man: Homecoming', 2017, 'M'), + (4, 'Avengers: Endgame', 2019, 'M'), + (5, 'Harry Potter and the Philosophers Stone', 2001, 'M'), + (6, 'Doctor Strange', 2016, 'M'), + (7, 'The Hobbit', 2012, 'M'), + (8, 'Sherlock', 2010, 'S'); + + +INSERT INTO `Counter` VALUES ('Movie', 9); + +INSERT INTO MovieGenre VALUES + (0, 0), + (0, 1), + (1, 1), + (1, 2), + (1, 3), + (2, 6), + (2, 1), + (3, 2), + (3, 3), + (4, 2), + (4, 3), + (5, 4), + (5, 7), + (6, 2), + (6, 3), + (6, 4), + (7, 4), + (7, 7), + (8, 5), + (8, 6); + +INSERT INTO `MovieCharacter` VALUES + (0, 'Peter Lustig', 'Peter', 0, 0, 0), + (1, 'Wade Wilson', 'Deadpool', 0, 1, 1), + (2, 'Andrew Paxton', 'Andrew', 0, 1, 2), + (3, 'Peter Parker', 'Spider-Man', 0, 2, 3), + (4, 'Tony Stark', 'Iron-Man', 0, 3, 3), + (5, 'Peter Parker', 'Spider-Man', 0, 2, 4), + (6, 'Tony Stark', 'Iron-Man', 0, 3, 4), + (7, 'Stephen Strange', 'Doctor Strange', 0, 6, 4), + (8, 'Hermione Granger', 'Hermine', 0, 4, 5), + (9, 'Harry Potter', 'The boy who lived', 0, 5, 5), + (10, 'Stephen Strange', 'Doctor Strange', 0, 6, 6), + (11, 'Bilbo Baggins', 'Bilbo Beutlin', 0, 7, 7), + (12, 'Sauron', 'Annatar', 0, 6, 7), + (13, 'Smaug', 'Smaug the Golden', 0, 6, 7), + (14, 'Sherlock Holmes', 'Consulting Detective Holmes', 0, 6, 8), + (15, 'John H. Watson', 'Dr. Watson', 0, 7, 8); + +INSERT INTO `Counter` VALUES ('MovieCharacter', 16); diff --git a/bonus-1/sqlite-test.db b/bonus-1/sqlite-test.db index 2efbbecc1b22e6b63d8c8861116dabcfc7134cad..08f71be86bb8ae2b3426c48c1892a97d99c8cad6 100644 GIT binary patch literal 53248 zcmeI*U2Ggj9RTo~o&EOR{cXp|#dV^t3Bf)!pR^#+s)Eb;;yCp==FTFDie#;Q6MNIW zU9-2B3P?a7kc^_J6d_t6+JXv#B1ENrN$|jbcJCUW z<3y>HiYWY7^33k+?Ck8%yKC>w&20VSvtBHm(_z$fW9PxlV1}{G#~de<$y~#q9RBpC zFXD{aTfmrYn7`TVwakIw=^VVB$=d4~ScG5ae+LicKb-$g_Vqj)aI;tJ^??uGY-36% z0TLhq5+DH*Ac1>D;8K0NQ79JKQ*P`o`Jx)0^+b8qjojr}MEy&4xmGDHRGfvD_D26W6bVB>np0hD*@tow56zZYFv0^<6m|PU#I7PLkT&__i*a zUitkOV3InSu4`;rj$M4v)C<$&x0Fl@=qe`jR!cJqg#x=+xel1rS-+8Ov)HCa-i8)BYr>KDF1uLN^}?ftTh_E&N#m0|tzRLjUsC5JQ2XkaB+2?EGh5$7 z(>xpRpI8y~RuxIMSUj9W+8JgPMn~DjgGoiwJ7F3seN{=*WLg^!Nj%qJ~(@o*Y*{99_uzo+s6--JpAUWTjiG<*%d0O#OwOrVJbNPq-L zfCNZ@1W14cNPq-LfCNaOUtq*kSrLq?8^vDW9F2r%xa=W=C zq9r$8UajuXRkk0rDL3$h@6_DJvhSTfEviGB%JzU-X*ONwq#NVMr$=|FGAplzxN+=E zh35j%agImTAuh8j3t`ha7W%#$G^)djYE3|`;|5Mmbb`=tw5q$AYCa0{0zVAJntAaB z=cMQRo-^BS#okKQ#v?J|xeWXV-h$WQRd@wngy%7VCK4b45+DH*AOR8}0TLhq5+DH* zAc4DCK;w)VrVMpMhMF!zRg)oCWvFnKTNrZFO56W0XW$L^JNyy91MqYBA$$`q-^~X| zbt3^1AOR8}0TLhq5+DH*AOR8}fqO}`{Duf@&e^C^T9*B~EQMR6<*+Fl9gA^u^fB3C zDWdlOd*+Ox10ewtAOR8}0TLhq5+DH*AORBi{}PZb{O_v$--2x!_y@cI&tU)m&%gpa z0w2I6nn-{INPq-LfCNZ@1W14cNPq-L;9d~ep=ef7fhplO*22&a!m!~Bt#tZdrrpCqT%=-E3$w?y2c(? zKs)9}QOB7NW7+o}`{z3`Za%;2`C%(u!@^s*O&AE{+3J0o#ttf=maw&d1y?-mRD#9| z4ohnMxq82uVmi*YB^o!NXXGrdSS}Ua(@kT;0w!wpYQC0A%S=xE8it-*~<{ zh=+%V(K|e>*D%veJc`+8etb>@7u?mr_*q@H|66eNhW`JUL=y>+011!)36KB@kN^pg z011!)36Q|uC?H$@P3v8^|Bt|v8TdE6iT(e756{9neh=WM@FVyhd;`7;m*GqBId}@5 zgn!`(0k6RMyYaxOP9#7ABtQZrKmsH{0wh2JBtQZraCZvuo!qjt5&6KbYujX`X~Xi1 z`-V0oBUKy3NLMwG5!doEQnVaKnxSQ7q-p~gsa&&VgsuG;ajxOG0gNjuju&7l8V(h} z6rC4vXX*|d^N*|Blac=v9Qu#rC;+Bx{~v)f^7;P_dLV4P!Ws)uANT)xk98kj6?ri8Uja#%eZ+RX&i$ik-xqTWPGA_+~*I+uukQ6ixb! zgB8b3#^89k8aT%ebYCSu74_x}^C2+U17*yU?{#yRZ;@|`Ryhn>Z6Dubzv4{cOXG3q z__MOlyIiH4_vZ~(*pFM~>P@%3k_1Vw_Gx_Aya;rokTclm7-q=U-F6fPr66!)H`0yw zXAL$nfhz`%c>Yr89C24xyr9)x5bfCa0>hXXz*-eCmtBtqc99Qyz3Th>*z5X)ZLqxu zF{8DylfCQ#zZ7SLAa8y3Jmx4wl&fzZ3;{XEbf`X^vuH=;1;*8jd0|M?Xn5LN)J=<=@-bykr z+y7O#CddE#6I_EgaWRWO^0j~)V@+n;kdCu7kpKyh011!)36KB@kN^pg011!)3EV*e z*`FT~^|XGo_tnJ7a3 z1Ri`4PkJyOeE{RhyYXaVLZSzEXWOL(3P?QAe12Cm7tPND-^}sC z<-(i(3;jRyy8~}KHKZH?1Q0*~0R#|00D=E0uye65YuUE`YQ5$>tH>FD!-ZqT)K$ePy$L)vdX{CtR;q60;SjE*EdrRi~x+qK!+Gq94|!yX-~R5XELqTLf}R z2GU!QRWU1rs_zx!!@bGyl5K6&7{cP#CaNqNjVr@5_V(jk)*2qxcj|jSccd4@QYw`{ z=%UJ%Nz_XtcvYC>T7Z&@CDEw!?}6?cS+k$kk*Ts`d}h(M$MPBL&akez-lE*9zNmzc zKV@gV=Bs>J0jRp=(YpqvhGxjN$w0RX`8`VVLI42-5I_I{1Q0*~0R#|00D*26$oHhQp_xzb`}MRjWX`P1N+tYFXFeKI z^!)#)o5x1%2q1s}0tg_000IagfB*srAkax5l`?Y4{{OE|wJ1jb0R#|0009ILKmY** z5I_Kdt`x}WDP!=i9|V5D{(o1_AVDL500IagfB*srAb?GJmb!C6Q!5DWwZ z!9XxDIRk$GES8h+92*7$!N9pQAm>BE5X_FnP>&8w+5!OQFsne9UP5w`V|FZt@Ics7 zftJeNVz8ydo;)r)7DG!X_U40q=Tq~-x;yG84JXcqF$V*|z>t9pTdw5(-{O-QZSsdH zu?hx)fq%vT&#SuH;HCU-{q=fs*Cvcx3=xSdqClVzegd$NbL2{$=1-y{E;|-OsUmhw P2gZ+p5)xA|FaZN!j`Aty literal 0 HcmV?d00001 diff --git a/bonus-1/src/Main.java b/bonus-1/src/Main.java deleted file mode 100644 index 63c51e6..0000000 --- a/bonus-1/src/Main.java +++ /dev/null @@ -1,48 +0,0 @@ -import java.sql.*; - -public class Main { - public static void main(String[] args) throws SQLException { - ConnectionManager.connect(); - - Person p = new Person(0, "Mueller", 'M'); - p.insert(); - - - for (Person ps : Person.findAll()) { - System.out.println(ps); - } - - - Genre g = new Genre(0, "Horror"); - g.insert(); - - for (Genre gs : Genre.findAll()) { - System.out.println(gs); - } - - Movie m = new Movie(0, "Löwenzahn", 1981, 'S'); - m.insert(); - - for (Movie ms : Movie.findAll()) { - System.out.println(ms); - } - - - MovieCharacter mc = new MovieCharacter(0, "Peter Lustig", "Peter Unlustig", 1, p.getPersonID(), 2); - mc.insert(); - - for (MovieCharacter mcs : MovieCharacter.findAll()) { - System.out.println(mcs); - } - - - MovieGenre mg = new MovieGenre(m.getMovieID(), g.getGenreID()); - mg.insert(); - - for (MovieGenre mgs : MovieGenre.findAll()) { - System.out.println(mgs); - } - - ConnectionManager.disconnect(); - } -} diff --git a/bonus-1/src/de/.DS_Store b/bonus-1/src/de/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3370e75b4eabe31de1c9f432c8ced7591214f5e6 GIT binary patch literal 6148 zcmeHKv1-FW43(M`0$DP4ykE#4T!Zrk-a|$2fCb{}P`}Z&@%QT^lf-Fhpcu5(NUi^AmuDoFfm}ss123_C>>_C|Sgw Q!-4)IkO}e085n?pZ-2uo!~g&Q literal 0 HcmV?d00001 diff --git a/bonus-1/src/de/hsh/.DS_Store b/bonus-1/src/de/hsh/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f87dcb79e655e49031e0f351ef9f7e3048ed0777 GIT binary patch literal 6148 zcmeH~K?=e^3`G;|LU7Zi%h`AUJ;5OL1igTW;6^Gax}Kx^lL>;=wTS#c@+X-IrEk$` zL_{~Y!%CzTkr~`nmKH{)$QwDxUaqpf_m|;x9*(G4eG+GF4R2+%AKMfXAOR8}0TLjA zA0lA)Hf%Pp%18nvKmtz!_I*fj(;Ql=`lkcIM*wJpvK!VuOF)wqpgFWuMFplYJ!rJ5 zk0Dm~c4&%oIkZ%*?V>S!XgpbMih*fu7fncDnq3%3fCNSarZsQv{@=ns&HtkorX)ZD ze?~x?uJ1N@skmF;UeD^gsM@-~p?)0UP!#f%6$2NroNPq-LfCNb3 zhX~lc4Qppr8A*TyNZ?7pz7Gj*nnO!f|8yYu2mozRcEj3d323qcG>4X|sK7L)2aQ(s zF~sWL4oz_`hnA|fT{MOdjVG&3F)*#|q6rC1vkLuHre|4g1L!&>UK-q5|WOfMZ}Ffv*yH E0J%RBuK)l5 literal 0 HcmV?d00001 diff --git a/bonus-1/src/de/hsh/dbs2/imdb/Starter.java b/bonus-1/src/de/hsh/dbs2/imdb/Starter.java new file mode 100644 index 0000000..6958339 --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/Starter.java @@ -0,0 +1,31 @@ +package de.hsh.dbs2.imdb; + +import javax.swing.SwingUtilities; + +import de.hsh.dbs2.imdb.gui.SearchMovieDialog; +import de.hsh.dbs2.imdb.gui.SearchMovieDialogCallback; + +public class Starter { + + /** + * @param args + * @throws Throwable + */ + public static void main(String[] args) throws Throwable { + + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + new Starter().run(); + } + }); + + } + + public void run() { + SearchMovieDialogCallback callback = new SearchMovieDialogCallback(); + SearchMovieDialog sd = new SearchMovieDialog(callback); + sd.setVisible(true); + } + +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/gui/CharacterDialog.java b/bonus-1/src/de/hsh/dbs2/imdb/gui/CharacterDialog.java new file mode 100644 index 0000000..1bbaabd --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/gui/CharacterDialog.java @@ -0,0 +1,232 @@ +package de.hsh.dbs2.imdb.gui; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +/** + * Dialog um einen Character eines Filmes zu aendern. + * Es kann eine neue Person (d.h. ein neuer Schauspieler) ausgewaehlt werden, + * und es kann Name und Alias des Characters veraendert werden. + * Die Position wird indirekt ueber die Sortierung der Liste im Movie-Dialog + * festgelegt. + */ +public class CharacterDialog extends JDialog { + private static final long serialVersionUID = 1L; + + private JLabel labCharacter; + private JTextField txtCharacter; + + private JLabel labAlias; + private JTextField txtAlias; + + private JLabel labPlayer; + private JTextField txtPlayer; + private JList lstPersons; + private JScrollPane scrPersons; + + private JPanel pnlButtons; + private JButton btnOk; + private JButton btnCancel; + + private String outcome = "cancel"; + + private CharacterDialogCallback callback; + + private String player; + + public CharacterDialog(CharacterDialogCallback callback) { + this.callback = callback; + + setTitle("Movie Character"); + setSize(200, 200); + setModal(true); + + GridBagLayout layout = new GridBagLayout(); + setLayout(layout); + + GridBagConstraints gbc = new GridBagConstraints(); + + // Festlegen, dass die GUI-Elemente die Gitterfelder in + // waagerechter Richtung ausfuellen: + gbc.fill = GridBagConstraints.BOTH; + + // Die Abstaende der einzelnen GUI-Elemente zu den gedachten + // Gitterlinien festgelegen: + gbc.insets = new Insets(2, 2, 2, 2); + + gbc.gridx = 0; + gbc.gridy = 0; + labCharacter = new JLabel("Character:"); + layout.setConstraints(labCharacter, gbc); + add(labCharacter); + + gbc.gridx = 1; + gbc.gridy = 0; + txtCharacter = new JTextField(50); + layout.setConstraints(txtCharacter, gbc); + add(txtCharacter); + + gbc.gridx = 0; + gbc.gridy = 1; + labAlias = new JLabel("Alias:"); + layout.setConstraints(labAlias, gbc); + add(labAlias); + + gbc.gridx = 1; + gbc.gridy = 1; + txtAlias = new JTextField(50); + layout.setConstraints(txtAlias, gbc); + add(txtAlias); + + gbc.gridx = 0; + gbc.gridy = 3; + labPlayer = new JLabel("Player:"); + layout.setConstraints(labPlayer, gbc); + add(labPlayer); + + gbc.gridx = 1; + gbc.gridy = 3; + txtPlayer = new JTextField(50); + layout.setConstraints(txtPlayer, gbc); + add(txtPlayer); + + txtPlayer.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void changedUpdate(DocumentEvent arg0) { + loadPersonList(); + } + @Override + public void insertUpdate(DocumentEvent arg0) { + loadPersonList(); + } + @Override + public void removeUpdate(DocumentEvent arg0) { + loadPersonList(); + } + }); + + gbc.gridx = 0; + gbc.gridy = 4; + gbc.gridheight = 4; + gbc.gridwidth = 2; + lstPersons = new JList(); + scrPersons = new JScrollPane(lstPersons); + layout.setConstraints(scrPersons, gbc); + add(scrPersons); + + lstPersons.addListSelectionListener(new ListSelectionListener() { + + @Override + public void valueChanged(ListSelectionEvent e) { + if (lstPersons.getSelectedIndex() != -1) { + String player = lstPersons.getSelectedValue(); + setPlayer(player); + } + } + }); + + gbc.gridx = 0; + gbc.gridy = 8; + gbc.gridheight = 1; + gbc.gridwidth = 2; + pnlButtons = new JPanel(); + layout.setConstraints(pnlButtons, gbc); + add(pnlButtons); + + btnOk = new JButton("OK"); + pnlButtons.add(btnOk); + + btnOk.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + outcome = "ok"; + setVisible(false); + } + }); + + btnCancel = new JButton("Cancel"); + pnlButtons.add(btnCancel); + + btnCancel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + outcome = "cancel"; + setVisible(false); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + }); + + setResizable(false); + pack(); + setLocationRelativeTo(null); + } + + public void start() { + pack(); + outcome = "cancel"; + setVisible(true); + } + + public void setCharacter(String character) { + txtCharacter.setText(character); + } + + public String getCharacter() { + return txtCharacter.getText(); + } + + public void setAlias(String alias) { + txtAlias.setText(alias); + } + + public String getAlias() { + return txtAlias.getText(); + } + + public void setPlayer(String player) { + txtPlayer.setText(player); + this.player = player; + } + + public String getPlayer() { + return this.player; + } + + public String getOutcome() { + return outcome; + } + + /** + * Neuladen der Personenliste. Wird immer aufgerufen, wenn der Text im Dialogfeld "schauspieler" + * geaendert wurde. + */ + private void loadPersonList() { + List p; + if (txtPlayer.getText().isEmpty()) { + p = new ArrayList(); + } else { + p = callback.getPersonList(txtPlayer.getText()); + } + lstPersons.setListData(p.toArray(new String[0])); + } + + +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/gui/CharacterDialogCallback.java b/bonus-1/src/de/hsh/dbs2/imdb/gui/CharacterDialogCallback.java new file mode 100644 index 0000000..a365729 --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/gui/CharacterDialogCallback.java @@ -0,0 +1,23 @@ +package de.hsh.dbs2.imdb.gui; + +import java.util.List; + +import javax.swing.JOptionPane; + +import de.hsh.dbs2.imdb.logic.PersonManager; + +public class CharacterDialogCallback { + + private PersonManager pm = new PersonManager(); + + public List getPersonList(String text) { + try { + List persons = pm.getPersonList(text); + return persons; + } catch (Exception e) { + JOptionPane.showMessageDialog(null, "Fehler bei der Personensuche: \n" + e.getMessage()); + e.printStackTrace(); + return null; + } + } +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/gui/MovieDialog.java b/bonus-1/src/de/hsh/dbs2/imdb/gui/MovieDialog.java new file mode 100644 index 0000000..1a8e913 --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/gui/MovieDialog.java @@ -0,0 +1,351 @@ +package de.hsh.dbs2.imdb.gui; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; + +import de.hsh.dbs2.imdb.logic.dto.CharacterDTO; +import de.hsh.dbs2.imdb.logic.dto.MovieDTO; + +public class MovieDialog extends JDialog { + private static final long serialVersionUID = 1L; + + private JLabel labId; + private JLabel txtId; + + private JLabel labTitle; + private JTextField txtTitle; + + private JLabel labYear; + private JTextField txtYear; + + private JLabel labType; + private JTextField txtType; + + private JLabel labGenre; + private JList lstGenre; + private JScrollPane scrGenre; + + private JPanel pnlButtons; + private JButton btnOk; + private JButton btnCancel; + + private JTable tabCharacters; + private JScrollPane scrCharacters; + + private JButton btnUp; + private JButton btnDown; + private JButton btnAdd; + private JButton btnEdit; + private JButton btnDelete; + + private String outcome = "cancel"; + + private MovieDialogCallback callback; + private TabModelCharacter tabModel; + + private MovieDTO movie; + + public MovieDialog(MovieDialogCallback callback, List allGenres) { + this.callback = callback; + + setTitle("Movie"); + setSize(400, 200); + setModal(true); + + GridBagLayout layout = new GridBagLayout(); + setLayout(layout); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.fill = GridBagConstraints.BOTH; + gbc.insets = new Insets(2, 2, 2, 2); + + gbc.gridx = 0; + gbc.gridy = 0; + labId = new JLabel("Id:"); + layout.setConstraints(labId, gbc); + add(labId); + + gbc.gridx = 1; + gbc.gridy = 0; + txtId = new JLabel(""); + layout.setConstraints(txtId, gbc); + add(txtId); + + gbc.gridx = 0; + gbc.gridy = 1; + labTitle = new JLabel("Title:"); + layout.setConstraints(labTitle, gbc); + add(labTitle); + + gbc.gridx = 1; + gbc.gridy = 1; + txtTitle = new JTextField(50); + layout.setConstraints(txtTitle, gbc); + add(txtTitle); + + gbc.gridx = 0; + gbc.gridy = 2; + labYear = new JLabel("Year:"); + layout.setConstraints(labYear, gbc); + add(labYear); + + gbc.gridx = 1; + gbc.gridy = 2; + txtYear = new JTextField(4); + layout.setConstraints(txtYear, gbc); + add(txtYear); + + gbc.gridx = 0; + gbc.gridy = 3; + labType = new JLabel("Type:"); + layout.setConstraints(labType, gbc); + add(labType); + + gbc.gridx = 1; + gbc.gridy = 3; + txtType = new JTextField(1); + layout.setConstraints(txtType, gbc); + add(txtType); + + gbc.gridx = 0; + gbc.gridy = 4; + labGenre = new JLabel("Genres:"); + layout.setConstraints(labGenre, gbc); + add(labGenre); + + gbc.gridx = 1; + gbc.gridy = 4; + gbc.gridheight = 4; + lstGenre = new JList(); + scrGenre = new JScrollPane(lstGenre); + layout.setConstraints(scrGenre, gbc); + add(scrGenre); + + gbc.gridx = 0; + gbc.gridy = 8; + gbc.gridheight = 1; + gbc.gridwidth = 4; + pnlButtons = new JPanel(); + layout.setConstraints(pnlButtons, gbc); + add(pnlButtons); + + btnOk = new JButton("OK"); + pnlButtons.add(btnOk); + + btnOk.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + outcome = "ok"; + updateMovie(); + setVisible(false); + } + }); + + btnCancel = new JButton("Cancel"); + pnlButtons.add(btnCancel); + + btnCancel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + outcome = "cancel"; + setVisible(false); + } + }); + + lstGenre.setListData(allGenres.toArray(new String[0])); + + gbc.gridx = 2; + gbc.gridy = 0; + gbc.gridheight = 8; + gbc.gridwidth = 1; + gbc.fill = GridBagConstraints.BOTH; + tabCharacters = new JTable(); + tabCharacters.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + tabCharacters.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + scrCharacters = new JScrollPane(tabCharacters); + layout.setConstraints(scrCharacters, gbc); + add(scrCharacters); + + gbc.gridx = 3; + gbc.gridy = 0; + gbc.gridheight = 1; + btnUp = new JButton("Up"); + layout.setConstraints(btnUp, gbc); + add(btnUp); + + btnUp.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + moveCharacterUp(); + } + }); + + gbc.gridx = 3; + gbc.gridy = 1; + gbc.gridheight = 1; + btnDown = new JButton("Down"); + layout.setConstraints(btnDown, gbc); + add(btnDown); + + btnDown.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + moveCharacterDown(); + } + }); + + gbc.gridx = 3; + gbc.gridy = 2; + btnAdd = new JButton("Add"); + layout.setConstraints(btnAdd, gbc); + add(btnAdd); + + btnAdd.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + addCharacter(); + } + }); + + gbc.gridx = 3; + gbc.gridy = 3; + btnEdit = new JButton("Edit"); + layout.setConstraints(btnEdit, gbc); + add(btnEdit); + + btnEdit.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + editCharacter(); + } + }); + + gbc.gridx = 3; + gbc.gridy = 4; + btnDelete = new JButton("Delete"); + layout.setConstraints(btnDelete, gbc); + add(btnDelete); + + btnDelete.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + deleteCharacter(); + } + }); + + tabCharacters.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + editCharacter(); + } + } + }); + + setResizable(false); + pack(); + setLocationRelativeTo(null); + } + + public void setMovie(MovieDTO movie) { + this.movie = movie; + txtId.setText(movie.getId() == null ? "" : ("" + movie.getId()) ); + txtTitle.setText(movie.getTitle()); + txtYear.setText("" + movie.getYear()); + txtType.setText(("" + movie.getType()).trim()); + + int [] indices = new int[movie.getGenres().size()]; + int j = 0; + for (String genre : movie.getGenres()) { + for (int i = 0; i < lstGenre.getModel().getSize(); i++) { + if (lstGenre.getModel().getElementAt(i).equals(genre)) + indices[j++] = i; + } + } + lstGenre.setSelectedIndices(indices); + + tabModel = new TabModelCharacter(movie.getCharacters()); + tabCharacters.setModel(tabModel); + + tabCharacters.getColumnModel().getColumn(0).setPreferredWidth(150); + tabCharacters.getColumnModel().getColumn(1).setPreferredWidth(150); + tabCharacters.getColumnModel().getColumn(2).setPreferredWidth(150); + + pack(); + } + + public void updateMovie() { + // Werte aus den Dialogfeldern in den Movie uebernehmen + movie.setTitle(txtTitle.getText()); + movie.setYear(Integer.parseInt(txtYear.getText())); + movie.setType(txtType.getText()); + + // In der Liste selektiere Genres in die Liste im Movie uebernehmen + Set genres = new HashSet(); + for (int i : lstGenre.getSelectedIndices()) { + String genre = lstGenre.getModel().getElementAt(i); + genres.add(genre); + } + movie.setGenres(genres); + } + + public String getOutcome() { + return outcome; + } + + + public void moveCharacterUp() { + int sel = tabCharacters.getSelectedRow(); + if (sel > 0) { + tabModel.up(sel); + tabModel.fireTableDataChanged(); + tabCharacters.setRowSelectionInterval(sel - 1, sel - 1); + } + } + + public void moveCharacterDown() { + int sel = tabCharacters.getSelectedRow(); + if (sel < tabCharacters.getRowCount() - 1) { + tabModel.down(tabCharacters.getSelectedRow()); + tabModel.fireTableDataChanged(); + tabCharacters.setRowSelectionInterval(sel + 1, sel + 1); + } + } + + public void addCharacter() { + CharacterDTO character = callback.addCharacter(); + if (character != null) { + tabModel.addRow(character); + tabModel.fireTableDataChanged(); + } + } + + public void editCharacter() { + int row = tabCharacters.getSelectedRow(); + CharacterDTO mc = tabModel.getRow(row); + callback.editCharacter(mc); + tabModel.fireTableDataChanged(); + } + + public void deleteCharacter() { + int row = tabCharacters.getSelectedRow(); + if (row >= 0) { + tabModel.deleteRow(tabCharacters.getSelectedRow()); + tabModel.fireTableDataChanged(); + if (row >= tabModel.getRowCount()) + row--; + if (row >= 0) + tabCharacters.setRowSelectionInterval(row, row); + } + } +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/gui/MovieDialogCallback.java b/bonus-1/src/de/hsh/dbs2/imdb/gui/MovieDialogCallback.java new file mode 100644 index 0000000..c89b846 --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/gui/MovieDialogCallback.java @@ -0,0 +1,35 @@ +package de.hsh.dbs2.imdb.gui; + +import de.hsh.dbs2.imdb.logic.dto.CharacterDTO; + +public class MovieDialogCallback { + + public CharacterDTO addCharacter() { + CharacterDialogCallback callback = new CharacterDialogCallback(); + CharacterDialog cd = new CharacterDialog(callback); + cd.setVisible(true); + if (cd.getOutcome().equals("ok")) { + CharacterDTO mc = new CharacterDTO(); + mc.setCharacter(cd.getCharacter()); + mc.setAlias(cd.getAlias()); + mc.setPlayer(cd.getPlayer()); + return mc; + } else + return null; + } + + public void editCharacter(CharacterDTO character) { + CharacterDialogCallback callback = new CharacterDialogCallback(); + CharacterDialog cd = new CharacterDialog(callback); + cd.setCharacter(character.getCharacter()); + cd.setAlias(character.getAlias()); + cd.setPlayer(character.getPlayer()); + cd.start(); + if (cd.getOutcome().equals("ok")) { + character.setCharacter(cd.getCharacter()); + character.setAlias(cd.getAlias()); + character.setPlayer(cd.getPlayer()); + } + } + +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/gui/SearchMovieDialog.java b/bonus-1/src/de/hsh/dbs2/imdb/gui/SearchMovieDialog.java new file mode 100644 index 0000000..35cc9ca --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/gui/SearchMovieDialog.java @@ -0,0 +1,192 @@ +package de.hsh.dbs2.imdb.gui; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; + +import de.hsh.dbs2.imdb.logic.dto.MovieDTO; + + +public class SearchMovieDialog extends JFrame { + private static final long serialVersionUID = 1L; + + private JTextField txtSearch; + private JButton btnSearch; + + private JTable tabResult; + private JScrollPane scrResult; + + private JButton btnAdd; + private JButton btnEdit; + private JButton btnDelete; + + private TabModelMovie tabModel; + + private SearchMovieDialogCallback callback; + + public SearchMovieDialog(SearchMovieDialogCallback callback) { + + this.callback = callback; + + setTitle("Search"); + setSize(200, 200); + + GridBagLayout layout = new GridBagLayout(); + setLayout(layout); + + GridBagConstraints gbc = new GridBagConstraints(); + + // Festlegen, dass die GUI-Elemente die Gitterfelder in + // waagerechter Richtung ausfuellen: + gbc.fill = GridBagConstraints.BOTH; + + // Die Abstaende der einzelnen GUI-Elemente zu den gedachten + // Gitterlinien festgelegen: + gbc.insets = new Insets(2, 2, 2, 2); + gbc.gridx = 0; + gbc.gridy = 0; + txtSearch = new JTextField(50); + layout.setConstraints(txtSearch, gbc); + add(txtSearch); + + gbc.gridx = 1; + gbc.gridy = 0; + btnSearch = new JButton("Search"); + layout.setConstraints(btnSearch, gbc); + add(btnSearch); + + gbc.gridx = 0; + gbc.gridy = 1; + gbc.gridwidth = 1; + gbc.gridheight = 8; + tabResult = new JTable(); + tabResult.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + tabResult.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + scrResult = new JScrollPane(tabResult); + layout.setConstraints(scrResult, gbc); + add(scrResult); + + gbc.gridx = 1; + gbc.gridy = 1; + gbc.gridheight = 1; + btnAdd = new JButton("Add"); + layout.setConstraints(btnAdd, gbc); + add(btnAdd); + + gbc.gridx = 1; + gbc.gridy = 2; + gbc.gridheight = 1; + btnEdit = new JButton("Edit"); + layout.setConstraints(btnEdit, gbc); + add(btnEdit); + + gbc.gridx = 1; + gbc.gridy = 3; + gbc.gridheight = 1; + btnDelete = new JButton("Delete"); + layout.setConstraints(btnDelete, gbc); + add(btnDelete); + + tabResult.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + editMovie(); + } + } + }); + + btnSearch.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + search(); + } + }); + + btnAdd.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + addMovie(); + } + }); + + btnEdit.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + editMovie(); + } + }); + + btnDelete.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + deleteMovie(); + } + }); + + WindowListener windowListener = new WindowAdapter() { + public void windowClosing(WindowEvent w) { + System.exit(0); + } + }; + this.addWindowListener(windowListener); + + setResizable(false); + pack(); + setLocationRelativeTo(null); + } + + private MovieDTO getSelection() { + if (tabResult.getSelectedRow() != -1) + return tabModel.getRow(tabResult.getSelectedRow()); + else + return null; + } + + private void addMovie() { + callback.addMovie(); + search(); + } + + private void editMovie() { + if (getSelection() == null) + JOptionPane.showMessageDialog(null, "Bitte zuerst einen Film auswaehlen!"); + else { + callback.editMovie(getSelection().getId()); + search(); + } + } + + private void deleteMovie() { + callback.deleteMovie(getSelection().getId()); + search(); + } + + private void search() { + int row = tabResult.getSelectedRow(); + + List result = callback.runSearch(txtSearch.getText()); + if (result != null) { + tabModel = new TabModelMovie(result); + tabResult.setModel(tabModel); + tabResult.getColumnModel().getColumn(0).setPreferredWidth(60); + tabResult.getColumnModel().getColumn(1).setPreferredWidth(300); + tabResult.getColumnModel().getColumn(2).setPreferredWidth(60); + tabResult.getColumnModel().getColumn(3).setPreferredWidth(60); + + tabResult.getSelectionModel().setSelectionInterval(row, row); + } + pack(); + } +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/gui/SearchMovieDialogCallback.java b/bonus-1/src/de/hsh/dbs2/imdb/gui/SearchMovieDialogCallback.java new file mode 100644 index 0000000..480a03d --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/gui/SearchMovieDialogCallback.java @@ -0,0 +1,83 @@ +package de.hsh.dbs2.imdb.gui; + +import java.util.ArrayList; + +import java.util.List; + +import de.hsh.dbs2.imdb.logic.GenreManager; +import de.hsh.dbs2.imdb.logic.MovieManager; +import de.hsh.dbs2.imdb.logic.dto.MovieDTO; + +public class SearchMovieDialogCallback { + + private MovieManager mm = new MovieManager(); + private GenreManager gm = new GenreManager(); + + public List runSearch(String search) { + List movies; + try { + movies = mm.getMovieList(search); + } catch (Exception e) { + new ShowErrorDialog("Fehler beim der Suche", e); + movies = new ArrayList(); + } + return movies; + } + + public void addMovie() { + movieDialog(null); + } + + public void editMovie(long movieId) { + movieDialog(movieId); + } + + public void deleteMovie(long movieId) { + try { + mm.deleteMovie(movieId); + } catch (Exception e) { + new ShowErrorDialog("Fehler beim Löschen des Films", e); + } + } + + private void movieDialog(Long movieId) { + + MovieDTO movie; + if (movieId == null) + movie = new MovieDTO(); + else { + try { + movie = mm.getMovie(movieId); + } catch (Exception e) { + new ShowErrorDialog("Fehler beim Laden des Films", e); + return; + } + } + + List allGenres; + try { + allGenres = gm.getGenres(); + } catch (Exception e) { + new ShowErrorDialog("Fehler beim Laden der Genres", e); + return; + } + + MovieDialog movieDialog = new MovieDialog(new MovieDialogCallback(), allGenres); + movieDialog.setMovie(movie); + + boolean finished = false; + while (!finished) { + movieDialog.setVisible(true); + finished = true; + + if (movieDialog.getOutcome().equals("ok")) { + try { + mm.insertUpdateMovie(movie); + } catch (Exception e) { + new ShowErrorDialog("Fehler beim Speichern des Films", e); + finished = false; // Movie Dialog offen halten + } + } + } + } +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/gui/ShowErrorDialog.java b/bonus-1/src/de/hsh/dbs2/imdb/gui/ShowErrorDialog.java new file mode 100644 index 0000000..92fb7dd --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/gui/ShowErrorDialog.java @@ -0,0 +1,77 @@ +package de.hsh.dbs2.imdb.gui; + +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.PrintWriter; +import java.io.StringWriter; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +public class ShowErrorDialog extends JDialog { + private static final long serialVersionUID = 1L; + + private JTextArea txtError; + + private JButton btnOk; + + public ShowErrorDialog(String msg, Exception e) { + + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw)); + + setTitle(msg); + setSize(200, 200); + setModal(true); + + GridBagLayout layout = new GridBagLayout(); + setLayout(layout); + + GridBagConstraints gbc = new GridBagConstraints(); + + // Festlegen, dass die GUI-Elemente die Gitterfelder in + // waagerechter Richtung ausfuellen: + gbc.fill = GridBagConstraints.BOTH; + + // Die Abstaende der einzelnen GUI-Elemente zu den gedachten + // Gitterlinien festgelegen: + gbc.insets = new Insets(2, 2, 2, 2); + + gbc.gridx = 0; + gbc.gridy = 0; + txtError = new JTextArea(sw.toString()); + JScrollPane scroll = new JScrollPane(txtError); + scroll.setPreferredSize(new Dimension(800, 400)); + layout.setConstraints(scroll, gbc); + add(scroll); + + + gbc.gridx = 0; + gbc.gridy = 1; + btnOk = new JButton("OK"); + layout.setConstraints(btnOk, gbc); + add(btnOk); + + btnOk.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); + + this.setResizable(false); + this.setSize(new Dimension(800, 400)); + + pack(); + + setLocationRelativeTo(null); + setVisible(true); + } + + +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/gui/TabModelCharacter.java b/bonus-1/src/de/hsh/dbs2/imdb/gui/TabModelCharacter.java new file mode 100644 index 0000000..bcfcef7 --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/gui/TabModelCharacter.java @@ -0,0 +1,82 @@ +package de.hsh.dbs2.imdb.gui; + +import java.util.ArrayList; +import java.util.List; + +import javax.swing.table.AbstractTableModel; + +import de.hsh.dbs2.imdb.logic.dto.CharacterDTO; + +/** + * Tabellenmodell, welches die Daten fuer eine Tabelle mit allen Characteren + * eines Movies bereitstellt und verwaltet + */ +public class TabModelCharacter extends AbstractTableModel { + private static final long serialVersionUID = 1L; + + private List data; + private List columns = new ArrayList(); + + public TabModelCharacter(List data) { + this.data = data; + columns.add("Character"); + columns.add("Alias"); + columns.add("Player"); + } + + @Override + public int getColumnCount() { + return columns.size(); + } + + @Override + public int getRowCount() { + return data.size(); + } + + @Override + public Object getValueAt(int row, int column) { + if (column == 0) + return data.get(row).getCharacter(); + else if (column == 1) + return data.get(row).getAlias(); + else if (column == 2) + return data.get(row).getPlayer(); + return null; + } + + @Override + public String getColumnName(int column) { + return columns.get(column); + } + + public List getData() { + return data; + } + + public void up(int index) { + if (index > 0 && index < data.size()) { + CharacterDTO element = data.remove(index); + data.add(index-1, element); + } + } + + public void down(int index) { + if (index >= 0 && index < data.size()-1) { + CharacterDTO element = data.remove(index); + data.add(index+1, element); + } + } + + public CharacterDTO getRow(int row) { + return data.get(row); + } + + public void addRow(CharacterDTO row) { + data.add(row); + } + + public void deleteRow(int row) { + data.remove(row); + } +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/gui/TabModelMovie.java b/bonus-1/src/de/hsh/dbs2/imdb/gui/TabModelMovie.java new file mode 100644 index 0000000..74f4545 --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/gui/TabModelMovie.java @@ -0,0 +1,89 @@ +package de.hsh.dbs2.imdb.gui; + +import java.util.ArrayList; +import java.util.List; + +import javax.swing.table.AbstractTableModel; + +import de.hsh.dbs2.imdb.logic.dto.MovieDTO; + +/** + * Tabellenmodell fuer eine Tabelle mit allen Filmen + */ +public class TabModelMovie extends AbstractTableModel { + private static final long serialVersionUID = 1L; + + private List data; + private List columns = new ArrayList(); + + public TabModelMovie(List data) { + this.data = data; + columns.add("Id"); + columns.add("Title"); + columns.add("Type"); + columns.add("Year"); + } + + @Override + public int getColumnCount() { + return columns.size(); + } + + @Override + public int getRowCount() { + return data.size(); + } + + @Override + public Object getValueAt(int row, int column) { + if (column == 0) + return data.get(row).getId(); + else if (column == 1) + return data.get(row).getTitle(); + else if (column == 2) + return data.get(row).getType(); + else if (column == 3) + return data.get(row).getYear(); + return null; + } + + @Override + public String getColumnName(int column) { + return columns.get(column); + } + + public List getData() { + return data; + } + + public void up(int index) { + if (index > 0 && index < data.size()) { + MovieDTO element = data.remove(index); + data.add(index-1, element); + } + } + + public void down(int index) { + if (index >= 0 && index < data.size()-1) { + MovieDTO element = data.remove(index); + data.add(index+1, element); + } + } + + public MovieDTO getRow(int row) { + return data.get(row); + } + + public void addRow(MovieDTO row) { + data.add(row); + } + + public void deleteRow(int row) { + data.remove(row); + } + + public void changeRow(int row, MovieDTO rowData) { + data.set(row, rowData); + } + +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/gui/TabModelPerson.java b/bonus-1/src/de/hsh/dbs2/imdb/gui/TabModelPerson.java new file mode 100644 index 0000000..6c2f950 --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/gui/TabModelPerson.java @@ -0,0 +1,78 @@ +package de.hsh.dbs2.imdb.gui; + +import java.util.ArrayList; + +import javax.swing.table.AbstractTableModel; + +/** + * Tabellenmodell mit allen Daten fuer einen Tabelle aus Personen + * + */ +public class TabModelPerson extends AbstractTableModel { + private static final long serialVersionUID = 1L; + + private ArrayList data; + private ArrayList columns = new ArrayList(); + + public TabModelPerson(ArrayList data) { + this.data = data; + columns.add("Name"); + } + + @Override + public int getColumnCount() { + return columns.size(); + } + + @Override + public int getRowCount() { + return data.size(); + } + + @Override + public Object getValueAt(int row, int column) { + if (column == 0) + return data.get(row); + return null; + } + + @Override + public String getColumnName(int column) { + return columns.get(column); + } + + public ArrayList getData() { + return data; + } + + public void up(int index) { + if (index > 0 && index < data.size()) { + String element = data.remove(index); + data.add(index-1, element); + } + } + + public void down(int index) { + if (index >= 0 && index < data.size()-1) { + String element = data.remove(index); + data.add(index+1, element); + } + } + + public String getRow(int row) { + return data.get(row); + } + + public void addRow(String row) { + data.add(row); + } + + public void deleteRow(int row) { + data.remove(row); + } + + public void changeRow(int row, String rowData) { + data.set(row, rowData); + } + +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/logic/GenreManager.java b/bonus-1/src/de/hsh/dbs2/imdb/logic/GenreManager.java new file mode 100644 index 0000000..c95df78 --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/logic/GenreManager.java @@ -0,0 +1,35 @@ +package de.hsh.dbs2.imdb.logic; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import de.hsh.dbs2.imdb.records.ConnectionManager; +import de.hsh.dbs2.imdb.records.Genre; + +public class GenreManager { + + /** + * Ermittelt eine vollstaendige Liste aller in der Datenbank abgelegten Genres + * Die Genres werden alphabetisch sortiert zurueckgeliefert. + * @return Alle Genre-Namen als String-Liste + * @throws Exception + */ + public List getGenres() throws Exception { + try { + ArrayList genres = new ArrayList(); + + for (Genre genre : Genre.findAll()) { + genres.add(genre.getGenre()); + } + + ConnectionManager.commit(); + return genres; + + } catch (SQLException e) { + ConnectionManager.rollback(); + throw e; + } + } + +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/logic/MovieManager.java b/bonus-1/src/de/hsh/dbs2/imdb/logic/MovieManager.java new file mode 100644 index 0000000..b2c48c3 --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/logic/MovieManager.java @@ -0,0 +1,181 @@ +package de.hsh.dbs2.imdb.logic; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import de.hsh.dbs2.imdb.logic.dto.*; +import de.hsh.dbs2.imdb.records.ConnectionManager; +import de.hsh.dbs2.imdb.records.Genre; +import de.hsh.dbs2.imdb.records.Movie; +import de.hsh.dbs2.imdb.records.MovieCharacter; +import de.hsh.dbs2.imdb.records.MovieGenre; +import de.hsh.dbs2.imdb.records.Person; + +public class MovieManager { + + /** + * Ermittelt alle Filme, deren Filmtitel den Suchstring enthaelt. + * Wenn der String leer ist, sollen alle Filme zurueckgegeben werden. + * Der Suchstring soll ohne Ruecksicht auf Gross/Kleinschreibung verarbeitet werden. + * @param search Suchstring. + * @return Liste aller passenden Filme als MovieDTO + * @throws Exception + */ + public List getMovieList(String search) throws Exception { + try { + ArrayList movies = new ArrayList(); + for (Movie movie : Movie.findAll()) { + if (movie.getTitle().toLowerCase().indexOf(search.toLowerCase()) == -1) continue; + + MovieDTO moviedto = new MovieDTO(); + + moviedto.setId(movie.getMovieID()); + moviedto.setTitle(movie.getTitle()); + moviedto.setType("" + movie.getType()); + moviedto.setYear(movie.getYear()); + + for (MovieGenre mg : MovieGenre.findByMovieID(movie.getMovieID())) { + moviedto.addGenre(Genre.findById(mg.getGenreID()).getGenre()); + } + + for (MovieCharacter mc : MovieCharacter.findByMovieID(movie.getMovieID())) { + CharacterDTO characterdto = new CharacterDTO(); + + characterdto.setCharacter(mc.getCharacter()); + characterdto.setAlias(mc.getAlias()); + characterdto.setPlayer(Person.findById(mc.getPlayedBy()).getName()); + + moviedto.addCharacter(characterdto); + } + + movies.add(moviedto); + } + + ConnectionManager.commit(); + return movies; + } catch (SQLException e) { + ConnectionManager.rollback(); + throw e; + } + + } + + /** + * Speichert die uebergebene Version des Films neu in der Datenbank oder aktualisiert den + * existierenden Film. + * Dazu werden die Daten des Films selbst (Titel, Jahr, Typ) beruecksichtigt, + * aber auch alle Genres, die dem Film zugeordnet sind und die Liste der Charaktere + * auf den neuen Stand gebracht. + * @param movie Film-Objekt mit Genres und Charakteren. + * @throws Exception + */ + public void insertUpdateMovie(MovieDTO movieDTO) throws Exception { + try { + Movie movie = new Movie( + movieDTO.getId(), + movieDTO.getTitle(), + movieDTO.getYear(), + movieDTO.getType().charAt(0) + ); + if (movie.getMovieID() == null) { + movie.insert(); + } else { + movie.update(); + } + for (MovieGenre genre : MovieGenre.findByMovieID(movie.getMovieID())) { + genre.delete(); + } + for (String genreName : movieDTO.getGenres()) { + Genre genre = Genre.findByGenre(genreName); + if (genre == null) { + genre = new Genre(null, genreName); + genre.insert(); + } + + MovieGenre mg = new MovieGenre(movie.getMovieID(), genre.getGenreID()); + mg.insert(); + } + for (MovieCharacter character : MovieCharacter.findByMovieID(movie.getMovieID())) { + character.delete(); + } + int position = 0; + for (CharacterDTO characterDTO : movieDTO.getCharacters()) { + Person player = Person.findByName(characterDTO.getPlayer()); + if (player == null) { + player = new Person(null, characterDTO.getPlayer(), 'U'); + } + MovieCharacter mc = new MovieCharacter(null, characterDTO.getCharacter(), characterDTO.getAlias(), position, player.getPersonID(), movie.getMovieID()); + mc.insert(); + ++position; + } + + ConnectionManager.commit(); + + } catch (SQLException e) { + ConnectionManager.rollback(); + throw e; + } + + } + + /** + * Loescht einen Film aus der Datenbank. Es werden auch alle abhaengigen Objekte geloescht, + * d.h. alle Charaktere und alle Genre-Zuordnungen. + * @param movie + * @throws Exception + */ + public void deleteMovie(long movieId) throws Exception { + try { + Movie.findById(movieId).delete(); + ConnectionManager.commit(); + + } catch (SQLException e) { + ConnectionManager.rollback(); + throw e; + } + } + + /** + * Liefert die Daten eines einzelnen Movies zurück + * @param movieId + * @return + * @throws Exception + */ + public MovieDTO getMovie(long movieId) throws Exception { + try { + Movie movie = Movie.findById(movieId); + if (movie == null) { + throw new Exception("Movie not found"); + } + MovieDTO moviedto = new MovieDTO(); + + moviedto.setId(movie.getMovieID()); + moviedto.setTitle(movie.getTitle()); + moviedto.setType("" + movie.getType()); + moviedto.setYear(movie.getYear()); + + for (MovieGenre mg : MovieGenre.findByMovieID(movie.getMovieID())) { + moviedto.addGenre(Genre.findById(mg.getGenreID()).getGenre()); + } + + for (MovieCharacter mc : MovieCharacter.findByMovieID(movie.getMovieID())) { + CharacterDTO characterdto = new CharacterDTO(); + + characterdto.setCharacter(mc.getCharacter()); + characterdto.setAlias(mc.getAlias()); + characterdto.setPlayer(Person.findById(mc.getPlayedBy()).getName()); + + moviedto.addCharacter(characterdto); + } + + ConnectionManager.commit(); + return moviedto; + + } catch (SQLException e) { + ConnectionManager.rollback(); + throw e; + } + } + +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/logic/PersonManager.java b/bonus-1/src/de/hsh/dbs2/imdb/logic/PersonManager.java new file mode 100644 index 0000000..b5f0647 --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/logic/PersonManager.java @@ -0,0 +1,37 @@ +package de.hsh.dbs2.imdb.logic; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import de.hsh.dbs2.imdb.records.ConnectionManager; +import de.hsh.dbs2.imdb.records.Person; + +public class PersonManager { + + /** + * Liefert eine Liste aller Personen, deren Name den Suchstring enthaelt. + * @param text Suchstring + * @return Liste mit passenden Personennamen, die in der Datenbank eingetragen sind. + * @throws Exception + */ + public List getPersonList(String text) throws Exception { + try { + ArrayList personen = new ArrayList(); + + for (Person person : Person.findAll()) { + if (person.getName().toLowerCase().indexOf(text.toLowerCase()) == -1) continue; + + personen.add(person.getName()); + } + + ConnectionManager.commit(); + return personen; + + } catch (SQLException e) { + ConnectionManager.rollback(); + throw e; + } + } + +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/logic/dto/CharacterDTO.java b/bonus-1/src/de/hsh/dbs2/imdb/logic/dto/CharacterDTO.java new file mode 100644 index 0000000..9cc8ed2 --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/logic/dto/CharacterDTO.java @@ -0,0 +1,45 @@ +package de.hsh.dbs2.imdb.logic.dto; + +/** + * Data Transfer Object (DTO) fuer Objekte der Klasse Character + * Enthaelt alles noetige fuer die Kommunikation GUI <-> Geschaeftslogik. + */ +public class CharacterDTO { + private String character; + private String alias; + private String player; + + public CharacterDTO(CharacterDTO that) { + this.character = that.character; + this.player = that.player; + this.alias = that.alias; + } + + public CharacterDTO() { + } + + public String getCharacter() { + return character; + } + + public void setCharacter(String character) { + this.character = character; + } + + public String getPlayer() { + return player; + } + + public void setPlayer(String player) { + this.player = player; + } + + public String getAlias() { + return alias; + } + + public void setAlias(String alias) { + this.alias = alias; + } + +} diff --git a/bonus-1/src/de/hsh/dbs2/imdb/logic/dto/MovieDTO.java b/bonus-1/src/de/hsh/dbs2/imdb/logic/dto/MovieDTO.java new file mode 100644 index 0000000..6e97bd8 --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/logic/dto/MovieDTO.java @@ -0,0 +1,69 @@ +package de.hsh.dbs2.imdb.logic.dto; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Data Transfer Object (DTO) fuer Objekte der Klasse Movie + * Enthaelt alles noetige fuer die Kommunikation GUI <-> Geschaeftslogik. + * Dazue gehoeren auch alle dem Movie zugeordneten Genres und Charaktere. + * Enthaelt die ID; falls es sich um einen neuen Movie handelt, der noch nicht + * in der Datenbank vorhanden ist, ist die ID null. + * @author felix + */ +public class MovieDTO { + + private Long id = null; + private String title = ""; + private String type = "C"; + private int year = 0; + private Set genres = new HashSet(); + private List characters = new ArrayList(); + + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public int getYear() { + return year; + } + public void setYear(int year) { + this.year = year; + } + + public void addGenre(String genre) { + genres.add(genre); + } + public void addCharacter(CharacterDTO cdto) { + characters.add(cdto); + + } + public Set getGenres() { + return genres; + } + public List getCharacters() { + return characters; + } + public void setCharacters(List characters) { + this.characters = characters; + } + public void setGenres(Set genres2) { + this.genres = genres2; + } +} diff --git a/bonus-1/src/ActiveRecord.java b/bonus-1/src/de/hsh/dbs2/imdb/records/ActiveRecord.java similarity index 85% rename from bonus-1/src/ActiveRecord.java rename to bonus-1/src/de/hsh/dbs2/imdb/records/ActiveRecord.java index e647c66..f9e0936 100644 --- a/bonus-1/src/ActiveRecord.java +++ b/bonus-1/src/de/hsh/dbs2/imdb/records/ActiveRecord.java @@ -1,3 +1,4 @@ +package de.hsh.dbs2.imdb.records; import java.sql.SQLException; public interface ActiveRecord { diff --git a/bonus-1/src/ConnectionManager.java b/bonus-1/src/de/hsh/dbs2/imdb/records/ConnectionManager.java similarity index 52% rename from bonus-1/src/ConnectionManager.java rename to bonus-1/src/de/hsh/dbs2/imdb/records/ConnectionManager.java index 13e9b09..74a07d8 100644 --- a/bonus-1/src/ConnectionManager.java +++ b/bonus-1/src/de/hsh/dbs2/imdb/records/ConnectionManager.java @@ -1,10 +1,15 @@ +package de.hsh.dbs2.imdb.records; import java.sql.*; +import org.sqlite.SQLiteConfig; + public class ConnectionManager { private static Connection connection; public static void connect() { + SQLiteConfig config = new SQLiteConfig(); + config.enforceForeignKeys(true); try { - connection = DriverManager.getConnection("jdbc:sqlite:sqlite-test.db"); + connection = DriverManager.getConnection("jdbc:sqlite:sqlite-test.db", config.toProperties()); connection.setAutoCommit(false); } catch (SQLException e) { e.printStackTrace(); @@ -21,6 +26,22 @@ public class ConnectionManager { } public static Connection getConnection() { + if (connection == null) { + connect(); + } return connection; } + + public static void commit() throws SQLException { + if (connection == null) { + connect(); + } + connection.commit(); + } + public static void rollback() throws SQLException { + if (connection == null) { + connect(); + } + connection.rollback(); + } } diff --git a/bonus-1/src/de/hsh/dbs2/imdb/records/Counter.java b/bonus-1/src/de/hsh/dbs2/imdb/records/Counter.java new file mode 100644 index 0000000..0f8bc5a --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/records/Counter.java @@ -0,0 +1,51 @@ +package de.hsh.dbs2.imdb.records; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class Counter { + + private String tableName; + private long counter = 0; + + public Counter(String tableName, long counter) { + this.tableName = tableName; + this.counter = counter; + } + + public static Counter get(String tableName) throws SQLException { + String sql = "SELECT * FROM `Counter` WHERE `TableName`=?"; + try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { + ps.setString(1, tableName); + try (ResultSet rs = ps.executeQuery()) { + if (!rs.isBeforeFirst()) { + Counter c = new Counter(tableName, 0); + c.insert(); + return c; + } + return new Counter(rs.getString("TableName"), rs.getLong("Counter")); + } + } + } + + private void insert() throws SQLException { + String sql = "INSERT INTO `Counter` VALUES (?, ?);"; + try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { + ps.setString(1, this.tableName); + ps.setLong(2, this.counter); + ps.executeUpdate(); + } + } + + public long next() throws SQLException { + ++this.counter; + String sql = "UPDATE `Counter` SET `Counter`=? WHERE `TableName`=?"; + try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { + ps.setLong(1, this.counter); + ps.setString(2, this.tableName); + ps.executeUpdate(); + } + return this.counter - 1; + } +} diff --git a/bonus-1/src/Genre.java b/bonus-1/src/de/hsh/dbs2/imdb/records/Genre.java similarity index 69% rename from bonus-1/src/Genre.java rename to bonus-1/src/de/hsh/dbs2/imdb/records/Genre.java index 2edb1ac..9c63463 100644 --- a/bonus-1/src/Genre.java +++ b/bonus-1/src/de/hsh/dbs2/imdb/records/Genre.java @@ -1,15 +1,22 @@ +package de.hsh.dbs2.imdb.records; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; public class Genre implements ActiveRecord { - private long genreId; + private Long genreId; private String genre; - public Genre(long genreId, String genre) { + private static Counter counter; + + public Genre(Long genreId, String genre) throws SQLException { this.genreId = genreId; this.genre = genre; + + if (counter == null) { + counter = Counter.get("Genre"); + } } public String getGenre() { @@ -20,12 +27,15 @@ public class Genre implements ActiveRecord { this.genre = genre; } - public long getGenreID() { + public Long getGenreID() { return genreId; } @Override public void insert() throws SQLException { + if (this.getGenreID() == null) { + this.genreId = counter.next(); + } String sql = "INSERT INTO `Genre` VALUES (?, ?);"; try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { ps.setLong(1, this.genreId); @@ -59,7 +69,7 @@ public class Genre implements ActiveRecord { } public static ArrayList findAll() throws SQLException { - String sql = "SELECT * FROM Genre"; + String sql = "SELECT * FROM `Genre` ORDER BY `Genre` ASC"; ArrayList genres = new ArrayList(); try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { try (ResultSet rs = ps.executeQuery()) { @@ -72,11 +82,23 @@ public class Genre implements ActiveRecord { return genres; } - public static Genre findById(long genreId) throws SQLException { + public static Genre findById(Long genreId) throws SQLException { String sql = "SELECT * FROM `Genre` WHERE `GenreID`=?"; try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { ps.setLong(1, genreId); try (ResultSet rs = ps.executeQuery()) { + if (!rs.isBeforeFirst()) return null; + return new Genre(rs.getLong("GenreID"), rs.getString("Genre")); + } + } + } + + public static Genre findByGenre(String genre) throws SQLException { + String sql = "SELECT * FROM `Genre` WHERE `Genre`=?"; + try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { + ps.setString(1, genre); + try (ResultSet rs = ps.executeQuery()) { + if (!rs.isBeforeFirst()) return null; return new Genre(rs.getLong("GenreID"), rs.getString("Genre")); } } diff --git a/bonus-1/src/de/hsh/dbs2/imdb/records/Main.java b/bonus-1/src/de/hsh/dbs2/imdb/records/Main.java new file mode 100644 index 0000000..13c6a9d --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/records/Main.java @@ -0,0 +1,8 @@ +package de.hsh.dbs2.imdb.records; +import java.sql.*; + +public class Main { + public static void main(String[] args) throws SQLException { + + } +} diff --git a/bonus-1/src/Movie.java b/bonus-1/src/de/hsh/dbs2/imdb/records/Movie.java similarity index 83% rename from bonus-1/src/Movie.java rename to bonus-1/src/de/hsh/dbs2/imdb/records/Movie.java index d6a64c8..efd189e 100644 --- a/bonus-1/src/Movie.java +++ b/bonus-1/src/de/hsh/dbs2/imdb/records/Movie.java @@ -1,19 +1,26 @@ +package de.hsh.dbs2.imdb.records; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; public class Movie implements ActiveRecord { - private long movieId; + private Long movieId; private String title; private int year; private char type; - public Movie(long movieId, String title, int year, char type) { + private static Counter counter; + + public Movie(Long movieId, String title, int year, char type) throws SQLException { this.movieId = movieId; this.title = title; this.year = year; this.type = type; + + if (counter == null) { + counter = Counter.get("Movie"); + } } public String getTitle() { @@ -40,7 +47,7 @@ public class Movie implements ActiveRecord { this.type = type; } - public long getMovieID() { + public Long getMovieID() { return movieId; } @@ -51,14 +58,17 @@ public class Movie implements ActiveRecord { @Override public void insert() throws SQLException { + if (this.getMovieID() == null) { + this.movieId = counter.next(); + } String sql = "INSERT INTO `Movie` VALUES (?, ?, ?, ?);"; try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { - ps.setLong(1, this.movieId); - ps.setString(2, this.title); + ps.setLong(1, this.movieId); + ps.setString(2, this.title); ps.setInt(3, this.year); ps.setString(4, "" + this.type); ps.executeUpdate(); - } + } } @Override @@ -98,11 +108,12 @@ public class Movie implements ActiveRecord { return movies; } - public static Movie findById(long movieId) throws SQLException { + public static Movie findById(Long movieId) throws SQLException { String sql = "SELECT * FROM `Movie` WHERE `MovieID`=?"; try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { ps.setLong(1, movieId); try (ResultSet rs = ps.executeQuery()) { + if (!rs.isBeforeFirst()) return null; return new Movie(rs.getLong("MovieID"), rs.getString("Title"), rs.getInt("Year"), rs.getString("Type").charAt(0)); } } diff --git a/bonus-1/src/MovieCharacter.java b/bonus-1/src/de/hsh/dbs2/imdb/records/MovieCharacter.java similarity index 75% rename from bonus-1/src/MovieCharacter.java rename to bonus-1/src/de/hsh/dbs2/imdb/records/MovieCharacter.java index 9060c40..bc88d84 100644 --- a/bonus-1/src/MovieCharacter.java +++ b/bonus-1/src/de/hsh/dbs2/imdb/records/MovieCharacter.java @@ -1,23 +1,30 @@ +package de.hsh.dbs2.imdb.records; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; public class MovieCharacter implements ActiveRecord { - private long movCharId; + private Long movCharId; private String character; private String alias; private int position; - private long playedBy; - private long movieId; + private Long playedBy; + private Long movieId; - public MovieCharacter(long movCharId, String character, String alias, int position, long playedBy, long movieId) { + private static Counter counter; + + public MovieCharacter(Long movCharId, String character, String alias, int position, Long playedBy, Long movieId) throws SQLException { this.movCharId = movCharId; this.character = character; this.alias = alias; this.position = position; this.playedBy = playedBy; this.movieId = movieId; + + if (counter == null) { + counter = Counter.get("MovieCharacter"); + } } public String getCharacter() { @@ -44,28 +51,31 @@ public class MovieCharacter implements ActiveRecord { this.position = position; } - public long getPlayedBy() { + public Long getPlayedBy() { return playedBy; } - public void setPlayedBy(long playedBy) { + public void setPlayedBy(Long playedBy) { this.playedBy = playedBy; } - public long getMovCharId() { + public Long getMovCharID() { return movCharId; } - public long getMovieId() { + public Long getMovieID() { return movieId; } - public void setMovieId(long movieId) { + public void setMovieID(Long movieId) { this.movieId = movieId; } @Override public void insert() throws SQLException { + if (this.getMovCharID() == null) { + this.movCharId = counter.next(); + } String sql = "INSERT INTO `MovieCharacter` VALUES (?, ?, ?, ?, ?, ?);"; try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { ps.setLong(1, this.movCharId); @@ -107,7 +117,7 @@ public class MovieCharacter implements ActiveRecord { } public static ArrayList findAll() throws SQLException { - String sql = "SELECT * FROM MovieCharacter"; + String sql = "SELECT * FROM `MovieCharacter` ORDER BY `Position`"; ArrayList movieCharacters = new ArrayList(); try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { try (ResultSet rs = ps.executeQuery()) { @@ -120,4 +130,13 @@ public class MovieCharacter implements ActiveRecord { return movieCharacters; } + public static ArrayList findByMovieID(Long movieId) throws SQLException { + ArrayList mcs = new ArrayList(); + for (MovieCharacter mc : MovieCharacter.findAll()) { + if (mc.getMovieID() == movieId) { + mcs.add(mc); + } + } + return mcs; + } } diff --git a/bonus-1/src/MovieGenre.java b/bonus-1/src/de/hsh/dbs2/imdb/records/MovieGenre.java similarity index 95% rename from bonus-1/src/MovieGenre.java rename to bonus-1/src/de/hsh/dbs2/imdb/records/MovieGenre.java index f034ab8..ec1a3a7 100644 --- a/bonus-1/src/MovieGenre.java +++ b/bonus-1/src/de/hsh/dbs2/imdb/records/MovieGenre.java @@ -1,3 +1,4 @@ +package de.hsh.dbs2.imdb.records; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -12,6 +13,14 @@ public class MovieGenre implements ActiveRecord { this.genreId = genreId; } + public long getMovieID() { + return movieId; + } + + public long getGenreID() { + return genreId; + } + @Override public String toString() { return "MovieGenre: " + this.movieId + " : " + this.genreId; diff --git a/bonus-1/src/Person.java b/bonus-1/src/de/hsh/dbs2/imdb/records/Person.java similarity index 71% rename from bonus-1/src/Person.java rename to bonus-1/src/de/hsh/dbs2/imdb/records/Person.java index e994ead..0e6baf8 100644 --- a/bonus-1/src/Person.java +++ b/bonus-1/src/de/hsh/dbs2/imdb/records/Person.java @@ -1,18 +1,25 @@ +package de.hsh.dbs2.imdb.records; import java.sql.*; import java.util.ArrayList; public class Person implements ActiveRecord { - private long personId; + private Long personId; private String name; private char sex; - public Person(long personId, String name, char sex) { + private static Counter counter; + + public Person(Long personId, String name, char sex) throws SQLException { this.personId = personId; this.name = name; - this.sex = sex; + this.sex = sex; + + if (counter == null) { + counter = Counter.get("Person"); + } } - public long getPersonID() { + public Long getPersonID() { return personId; } @@ -34,6 +41,9 @@ public class Person implements ActiveRecord { @Override public void insert() throws SQLException { + if (this.getPersonID() == null) { + this.personId = counter.next(); + } String sql = "INSERT INTO `Person` VALUES (?, ?, ?);"; try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { ps.setLong(1, this.personId); @@ -81,11 +91,23 @@ public class Person implements ActiveRecord { return personen; } - public static Person findById(long personId) throws SQLException { + public static Person findById(Long personId) throws SQLException { String sql = "SELECT * FROM `Person` WHERE `PersonId`=?"; try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { ps.setLong(1, personId); try (ResultSet rs = ps.executeQuery()) { + if (!rs.isBeforeFirst()) return null; + return new Person(rs.getLong("PersonID"), rs.getString("Name"), rs.getString("Sex").charAt(0)); + } + } + } + + public static Person findByName(String name) throws SQLException { + String sql = "SELECT * FROM `Person` WHERE `Name`=?"; + try (PreparedStatement ps = ConnectionManager.getConnection().prepareStatement(sql)) { + ps.setString(1, name); + try (ResultSet rs = ps.executeQuery()) { + if (!rs.isBeforeFirst()) return null; return new Person(rs.getLong("PersonID"), rs.getString("Name"), rs.getString("Sex").charAt(0)); } } diff --git a/bonus-1/src/de/hsh/dbs2/imdb/util/DBConnection.java b/bonus-1/src/de/hsh/dbs2/imdb/util/DBConnection.java new file mode 100644 index 0000000..b180e68 --- /dev/null +++ b/bonus-1/src/de/hsh/dbs2/imdb/util/DBConnection.java @@ -0,0 +1,28 @@ +package de.hsh.dbs2.imdb.util; + +import java.sql.Connection; +import java.sql.DriverManager; + +public class DBConnection { + + private static Connection conn; + + static { + conn = null; + try { + // TODO: Connection to SQLite-DB + conn = DriverManager.getConnection( + "jdbc:oracle:thin:@dboracleserv.inform.hs-hannover.de:1521:db01", "user", "pwd"); + conn.setAutoCommit(false); + System.out.println("Connect durchgefuehrt ...."); + } catch (Exception e) { + System.err.println("Error while connecting to database"); + e.printStackTrace(); + System.exit(1); + } + } + + public static Connection getConnection() { + return conn; + } +}