From 24112322b95f892a15dca453c5ec5a5689a5d319 Mon Sep 17 00:00:00 2001 From: Sherwin Price Date: Thu, 19 Feb 2026 21:12:03 -0500 Subject: [PATCH] update project. --- .../executionHistory/executionHistory.bin | Bin 115665 -> 126274 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/9.3.1/fileHashes/fileHashes.bin | Bin 25947 -> 27047 bytes .gradle/9.3.1/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../9.3.1/fileHashes/resourceHashesCache.bin | Bin 20673 -> 21489 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/buildOutputCleanup/outputFiles.bin | Bin 19901 -> 19973 bytes .gradle/file-system.probe | Bin 8 -> 8 bytes .project | 6 ++ build.gradle | 3 +- db/sample.db | Bin 12288 -> 12288 bytes .../edu/bookocontacts/ControlDDXDialog.java | 20 ++++++- .../java/edu/bookocontacts/StorageMonitor.aj | 10 ++++ .../edu/bookocontacts/ViewController.java | 24 +++++++- .../java/edu/bookocontacts/model/DATASET.java | 3 +- .../java/edu/bookocontacts/model/Factory.java | 6 +- .../edu/bookocontacts/model/MailAddress.java | 52 +++++++++++++----- 17 files changed, 100 insertions(+), 24 deletions(-) create mode 100644 src/main/java/edu/bookocontacts/StorageMonitor.aj diff --git a/.gradle/9.3.1/executionHistory/executionHistory.bin b/.gradle/9.3.1/executionHistory/executionHistory.bin index 855f95c985714aac800ae4adeff4a192a4a1bb43..1d8e1c2bcac58155987c5bc31a6afed25e1142a7 100755 GIT binary patch delta 5538 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 VpYC(Bm>JOe*i78zMCE(UTmUVxH2DAk delta 2463 zcmX?fi~V9d`vwyUM()X`5+5epN-8r-Zfu+(zHvf=_-03s&qcP`X*osad1l2)X({Jo5nFZ+RyBGVi1Gm1<;@K}uT3s~`FkEg22OZ9*3Sh*;;E>R_R z!s7^*&5T=9Q%d!d^7FIvlk@XR5|c}cCwn|qX1ov9;-v557~&Z08lnfblv!ZQM(z`r z9Xr!a*2(Rj=eMbkaRG*QR4v!R=1gAjgl)3n6Dh{0FfO~IV@gU`+zHA4)PtPEVN6$Ts=G6J8N!0iV)JZ#Ui<=G_7BElx8@ zIYX3#BpF{p?AY*3TF5E+xZ|Dbf|gf;XGpbI1B*_>7Hf_58LPicr zsOSD~TQJS>_pG_t7oYM^?8HFYXyp$4<^ox??+SxBN zrPW~lyQ!B{Ctr9WHC_HWBhTaoFIgEO@iY0tde+JJUkM2@3%oPEQ2kYL$~#T7M;yFr znTg=onXd4Vk#Bn4Yeo)K4cwC*HnIyb3%oC9I>x`h`&(Pz;WOsaWlIs7CfjdB(WCzc zWXTh^E05|9v=&*0`MfIo!1o79{k+2{>hHhep8nwpBgm3FAJ@gKT4pm>=DX|4AEw!9 z2u;)9Kf!d_-y3=(}8*0WC6U(Coo{lGFtRv~5qxhZ^~*u%P-7Vd8RCQ{7nJX!IT z2q^gY!3rk#zFmu}=*fE*gr(@Y@S$OPm=dF-;H<;;1?NgE+>E2mA1N)f&f7D2<8$4~ zbKmg^ViW?CdCIk?%PTXwOy2nEw)}Ui1+z5|PWSPsDxLDeA}i) zfXXQ~#`_?%{igq%&nPVLYzlL}_Hy0e!wa6wm;C?u891N(oX;pYy=5MwKPY$c32-GV z8hMwvM|OVTa7}E_ehe~23M9odUEn@rqQJK)*R9uVs4r00sb%BjJZKC`Hr>Xk{OpxE_|&pZ80P3bi2ij<^nk`;rA14x=lIRO=Yyti%p&` zXvtVJJ>n&!s04Z$+rIqImgB}BMW!b_Vw94Ikg9pVrs|KHaITR!+X07&Szy@@TGJ;i zVN`QOFGqX8vh%nY`(ObIE>svWO3Yrc!q>dh6P7Saihru+zBVgW)RwtDB=^nE2Y;4< zT<}AGy5B2CF-P>$tMMVI5`4|i*yom*T#{c@3CUFq0_&uvD^GC{?$~#r?5ohzu9}Zv zV>*SVUwp+VD$!cmabgv>)%;VhgJ?}N6lmvRgwH&PdwczvxuNkGJ&`T(Y?0G)M>60fM7L#NUKrfP3 zfVJP5e(wpRv=n;Lvl1-%8>IW)5iuVI0rX-9qTo3f#E=jrUcVp`HyC<0$1oGk%pUExS zYMg`~Q?;K|Y6$kSBCSUwyIQ^Rqqqbm3?F*i%g<{-CQ&K;-wEAX0*nVyWBeOIB Doaanc diff --git a/.gradle/9.3.1/executionHistory/executionHistory.lock b/.gradle/9.3.1/executionHistory/executionHistory.lock index 169f2c3e6cd2619ab90f1c4cce9522d707c03fa3..cb9861733db1738471ecd27b002eab10cc5d6e5e 100755 GIT binary patch literal 17 UcmZSXH>umx74fHr0Sp)o05w(wi~s-t literal 17 UcmZSXH>umx74fHr0Sp+$0X01Ya{vGU diff --git a/.gradle/9.3.1/fileHashes/fileHashes.bin b/.gradle/9.3.1/fileHashes/fileHashes.bin index 3db444475ba1842a647d5846243154bd967f6d82..61b8b5125d04235eebe178491556d15189f7d442 100755 GIT binary patch delta 2773 zcmcb8igEd6#tkMCj;kB4AMMs&m+Qd*2Chfh8R3-rOl44HyZ;r|U^mn*$g z6^Mt3r*GcuD&fe;U+i|&VX}-cL@>2?a;;>8z?_|Rb!l_CxFCXQJ12jY4CF6~Wh}j& zXAcp}be?Q0rO02($QB`L*9R3Vog6A+ zo~!Va-|o1hYTRdNh@^#1?p0I}&{mu14fATZ*s@>f`^E*T=HG1+? zB?}GPq9#-BLhVx!!8B!dxV6>?B9``gv#5#^6O(}CM#UfE3k^6HJ9-E!e6_pM zvp@4({lClGcy1-%Xl7twoKxYi+6~c@+&q~v=$698s)*Y?SMR$_XVB{1t?&gCeTK*~d}Ux@&@*OWV9;b>U{C~Mf%X{D-vI3JXUOxZ2wav9{firD$Q5FL9t zHp|8pFa|9tk$Z6MuH@-$O^=HDjxO~8sVZ-EFNUa+HpDb{J;$qvI}8i$TFPXtJzwY< zfOM1{-pUWr!Dc%7e!Po9!NlCCHNw9#?kdKekD1xD1*E8A_JIV5B8h2}ofB3Dw(n+G z`+DZfuc{xn6xKI5gVp$}yoRWe?8UTNvW(lEz43ht6Wh*P>fGNUruwT~gy`T%pKP0` zR$t+-aswj3`W(}UUv6&KZ!hJGnzDW8@6UgeKJ$%#o)lRcA+>R(i;79VO#I?<{5ac|4q>HDDyydXwOXk!{FA-;7s z`{dl#bvG`EZU0#Q9jxO(&LM~nW^{KmC<;gk&MT>D{?K@K!K#zqpWirwbd>9ttz=+e zUiZ6GSkAiiJ>l}ji?-t0e%nE+Di&^n<_vx;=88MWCa3>+lrXvY(-&oi zt24kl{8es4T*CGX)9njPg`S=Nuw!oX((+0EyP2&ZI#fYf8{`tM{K?0Y%j)Y6eq)*) z7to-wFn*uE^t>9VDg%hQqM&SumM2ckp0-hc*6#HWgzk$jHu!A~(owdae;-5#_W?|o zVABE3l^~aJADDbF#id?&e&ceR4+8U4F8!6IH`?T@9asv{bDA^B1I?fkALHrjDwuZ)>71L`~Y{WNj+BU3L#xhrh~i zhz=G|<$@NZ9NC5z^+og9+xKrS*_?WP-V2BpRUW98S(uiHHl0kaiDS#HkL%K&DZEh% zssmawiHKn8h_QRZE$;2l+jTtDvEgdA7Ffq2ZCi*P4D}~5wFEQ@pXYNqZ6kI6?uFca z8&`t09AS%uXyN>bsY9P(U7gVdn=_%&%kFp@q=iCt6hd@xyvNjWC&nbZulK)deOPG! z?kKfm3Q#R&5G`zpm|B)Zw3bCEUfQtvV3p~4CWoI;9pw-m>{y(Y+8xV%WA!()8E+=F z2(`G+f$C_1=#Z9RU|^_6i<3@sMfPJ6|IAp@ty{h;pNfZSnF!G$6pZOC{oDT&RP8gyPgyP^Fh4&XJIWDn+Uwzh$mD=Wz9tioB0kwnAF3Dpbcmhz|C9m^!jd zcFi`tSzNYdd2>Q1J9{Crj(P?L*;klacK$vXkp4X6@RwKbtPeHs*ov%$fq~NuQ^&;0 y$02gociX3~;$>|68hj5`2bTh-jt&{N#AWi6)+U?P)rrpDs^^cYg%wm#=>Y&{llZm( delta 1274 zcmZ2}nep~1#tkMCf>Rr=AMMs&m+Qd*2CBU`jbti zB{!!@w=+#yKG~@IuMiWA!cE!eB)`uNxqWICf5E3=*E47vsuOHp$Rna$&e0 zgb^DAW%R=s2ZN-r8#c+%5X~@Qh#4DW_3X+f8Ja?58NMR-9W{}z5FMvjYy>iBmOqDbQIWaosH@}H`?ugyvowPkJ($$hi)0a(p^;Tnh<@gJbjlTSYGc&EBx z=I&!#)b_QnTme=y$)FLUhW+(q+eEecvPlM=5CPWbnC^XNdZGHO;*@uqW{)^{)iM*o zM$8vp4$;B!8dJyna;9Va`@6rj^&LKAE?u@1RR_C2nvPHgMS&-7S02?JXf3h~^LbVF zf$tAg%L<4koH1xx7!(EWd|Vf^YMISkneVPEf0$;cL3ONz=wPp&9Ox@N*(=GgUTzBC zC-$(eriHs3zljv{Iztt%f+&>yj%l<|n7`>~ZKjFbUKW-+ZszF3_0iuHi6bWc) zMaX&jA_txt?+x25&sCga-38K7_}rF7I(nm#mYTt~|v-xMSaevadobZ~NF>R8k^Wm&eYlaAtD zpLCf}DM;#?FWe4t1p@;ESK;L2$z}BsQZ?__RQ*vC&NUKeJKzujHFp-oT+sqdbGJS< z;9PX;*;?O!U$&||-FOeIBP=`(qJ!IlNF9?54WKUJwwQb{#U-rpk;$3Tgr^QNC+iL!)*TS#A9KE6m)-hignxuKXKso^E;&mJV diff --git a/.gradle/9.3.1/fileHashes/fileHashes.lock b/.gradle/9.3.1/fileHashes/fileHashes.lock index d737ca8b422d907eccbfe331de15426bae641509..8d8daeef27cc6bc2773923046f8eb3bce597d054 100755 GIT binary patch literal 17 VcmZS1z6QqL7?YD&IcLSzG3C!0zJ2&^ioc+`JfGzuaZ%sjbPQbAzNafP=1P9fqD!9exNQzaDy z)~_x%YbbY-g$njgUMr~}uuD(0_r3T3Q~eSm7`%3}s#Jr( z^TLCsS&cJZK?ToGo+}l|ubN}9r@*HLA{O|0@>8h*jX!%PhRszwQV9_Z+7I&t)6K;j zm@5l}pyHyFb)_E&NQ*fAc{}+*9Yiqj;$&8t83Ni|DsRF+?%D_u40fM9RYpNT=d!H( zW=?ets9@&gwK6|6LR6>f{Wtif1`!N;2(v3vDLZ9xpNBM5eD37AvH=l=EYF+$P39Rx z1cOy!iVMA${*$}iejX~`4HGY!?!7$rmhd8oc;I@Ncv;Ge7?De{Cn4fN)svsf282|4 za`o-DfAI+_Xbw|cuN`b~Bt#eL?7(ce_>_N9U(M#&L)AyZ#9=f814rOS#UJ7u4NmZH zcJyfAs0X=Ql7WFi5QGJ;D2nLsPO0a0di5ZFRYzd~0|SE`s*3)bJ*#8WwK(@O??{hh zZ>YvpG2iOQ4?Ddl4sSPHJ{|dU{wz!tnzt%%1a=rqH9Rd-Z>hTajU1*D-|wjhs)AZ( zJm(VovvtQac}x{avlqQd3^^*~(yE;~m-Da(riwj0uMMM|HPe27?-#Xceh3OIG|z;q z1!-y6WeYw}?^R}>^+9+mrXhJ=7xzWYOL_7qecv2Y(NAWWDryp~)16XIJ-(g4+I!a< zuS=5~J%ocJI2U}J)|6kp_G_|2@Dg84UHt+fd`)%ooGqu;KjtZUs)MP*W}cm!SH2|I zj$c<9EG%UNchE1n~C0#ill z+S3W<4G!#uT~&K0x^%^1s^IQV&#FB8>XPkM8S7VHJzNkf>R|~b>V@D-jT-`|io|0X zUpEP)Ae6vVNX*(M;mTyVeAaU9N=>z$ewZpcCcWZZcsKvSylF2gJq8#$;F736tN-N=%lO`!Ly7-edApc@LidP{6>zCb&`YhxkSV4x!DC9t|7-URNji diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 28e5aeac3631aceba5fe8a2df7c55284bf62bdd9..8c66e333064e40c4f4285d9e795550f7146877cb 100755 GIT binary patch literal 17 VcmZRUJyE!~bl?1H1~6de0{}JF1a$xa literal 17 VcmZRUJyE!~bl?1H1~6bc0{}LX1u_5t diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index e8a51d853d53e2c500d2f3fd3fc36dec3d2f484c..014668ab9a1dfa533d66a9648f88c255a3fcdaca 100755 GIT binary patch delta 128 zcmdlxo3V8c;|3E6#-Pon5*CaCbGCW0GKlx-Fo1#Y`NgS{Od8KErbny^sz?QkG59|G z4+Y<{-_5FC;GP8)-@7?h+JH&Gcf#Yu#FgvLK}A1rZk6R`Vm!D}@rU?Eg9w4mjvh6v Nll#4$CntEY0sv4nE(!nu delta 46 zcmZpj!?<@g;|3E6M!(Ib5*Cb`TP1%mZeA;`!L<3UEHe{h;zq?E;u{Ti2yAxrs9^;F Df`kxS diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe index 796d40abf448b289675ffcbbc80b29871755db95..d3d01cb73ead872f4fc0541fe1d65143ee9d0110 100755 GIT binary patch literal 8 PcmZQzV4PENgxLfD2Y><* literal 8 PcmZQzV4PDnN#6|s2TTGR diff --git a/.project b/.project index 82c52ab..52c68db 100644 --- a/.project +++ b/.project @@ -15,8 +15,14 @@ + + org.eclipse.ajdt.core.ajbuilder + + + + org.eclipse.ajdt.ui.ajnature org.eclipse.jdt.core.javanature org.eclipse.buildship.core.gradleprojectnature diff --git a/build.gradle b/build.gradle index c39434f..b7f1ebf 100755 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,7 @@ plugins { id 'application' + id("io.freefair.aspectj") version "9.2.0" id("org.openjfx.javafxplugin") version "0.1.0" } @@ -36,7 +37,7 @@ sourceSets { javafx { version = "25.0.2" - modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.graphics' ] + modules = [ 'javafx.controls', 'javafx.fxml'] } dependencies { diff --git a/db/sample.db b/db/sample.db index d2a9158802a7730e52dbd35fb349c369384b7173..edc534093e77e1c2834d0bad4d6d022d8b9a8d59 100644 GIT binary patch delta 385 zcmZojXh@hK%_uNY#+gxIW5ObSu|5V4-Wmq}%lwVJ|M*t%S@Z7YSLdzSSeU|FZ_mZf zAuX;d>gt=Hk(is95}cb^l3`?Gplfb!u4`#&X_;4=lVfabtl*lHs}NkGqu`TRl%B7n z;OnBGU}R`+WM@Y*Yj%JEOR$s(vDyb7E3XYEXW0v5ASXu8FaUu7Rns zadMHlg{6goLuFz{e!gCEey*W`fq_DJMrKKBQD$Dcf=6m*dPa$kLU4X=s)BQ7Nu`d0 zub+Z32uyC2ZxCl-VBp}t$jJYa|2_Xj{@?sx`5*J&<-fjJQDFoB!~o987xg8?S(rH( VxmZ}485!9)K_n*=3o|1p2LPceWIq4^ delta 301 zcmZojXh@hK&B!%T#+i|8W5ObSu~Q7}y#E;ZFY`C@v+@4p>*KTLd(QWKW8pSl13hMT zMqy!9ZE>!!{JfyVN)r=fT_ZyST}yK_lc2=Pu>3rSjQreGz2y8{9R(c)g~|V9CvaM^ zu`^1Gt1>uF-YloZtKjRRU}R`+WX2!HAUn}fl0}w-opJJOIcXL@7IwzTT=KF}xtS#y z4vD#mRrz@!lMIcF6?_vj^Av(hbQGNP^K**JGIMfL!3G&vm>V)MFld7u#Y@;xlN;q5 z#QEPdu=8JJ;J?WKoBu2SOa90FclodLU*D{#uz`PK0O#b3`V!)-%#4iOEDQ_`Y+TGB MHYXDcGb1Ml00`VreE { @FXML private TextField tfZip; - public ControlDDXDialog() { + public ControlDDXDialog(Contact ct) { super(); String fxml = "/media/ControlAddressDDXDialog.fxml"; FXMLLoader fxmlLoader = new FXMLLoader(getClass().getClassLoader().getResource(fxml)); fxmlLoader.setController(this); fxmlLoader.setLocation(getClass().getResource(fxml)); + try { fxmlLoader.load(); } catch (IOException exception) { @@ -55,12 +56,25 @@ public class ControlDDXDialog extends Dialog { getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL); setTitle("Contact Address Dialog"); setHeaderText(String.format("Enter Contact Details")); - setPropertyBindings(); + + setPropertyBindings(ct); + setResultConverter(); } - private void setPropertyBindings() { + private void setPropertyBindings(Contact ct) { Logger.getLogger(getClass().getName()).log(Level.INFO, "setPropertyBindings called."); + if (ct == null) { + return; + } + tfFirstName.setText(ct.getFirst_name()); + tfLastName.setText(ct.getLast_name()); + tfPhoneNo.setText(ct.getPhoneNo().getphone_number()); + tfEmail.setText(ct.getEmail().getEmail_address()); + tfStreet.setText(ct.getMailing_address().getStreet()); + tfCity.setText(ct.getMailing_address().getStreet()); + tfState.setText(ct.getMailing_address().getState()); + tfZip.setText(ct.getMailing_address().getZip()); } private void setResultConverter() { diff --git a/src/main/java/edu/bookocontacts/StorageMonitor.aj b/src/main/java/edu/bookocontacts/StorageMonitor.aj new file mode 100644 index 0000000..41a2da7 --- /dev/null +++ b/src/main/java/edu/bookocontacts/StorageMonitor.aj @@ -0,0 +1,10 @@ +package edu.bookocontacts; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public aspect StorageMonitor { + + pointcut save(): execution(public * edu.bookocontacts.model.Factory.*(..)); + +} diff --git a/src/main/java/edu/bookocontacts/ViewController.java b/src/main/java/edu/bookocontacts/ViewController.java index 9ebe4ab..d90fc71 100755 --- a/src/main/java/edu/bookocontacts/ViewController.java +++ b/src/main/java/edu/bookocontacts/ViewController.java @@ -27,6 +27,8 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.input.MouseEvent; +import javafx.scene.input.PickResult; /** * FXML Controller class @@ -100,7 +102,7 @@ public class ViewController implements Initializable { @Override public void handle(javafx.event.ActionEvent t) { - ControlDDXDialog dialog = new ControlDDXDialog(); + ControlDDXDialog dialog = new ControlDDXDialog(contactView.getSelectionModel().getSelectedItem()); Optional result = dialog.showAndWait(); @@ -137,6 +139,26 @@ public class ViewController implements Initializable { updatecontactView(); } }); + + contactView.setOnMouseClicked(e -> { + + PickResult p = e.getPickResult(); + ControlDDXDialog dialog = new ControlDDXDialog(contactView.getSelectionModel().getSelectedItem()); + Optional result = dialog.showAndWait(); + if (result.isPresent()) { + log("result is present."); + // add to storage + Contact ct = (Contact) result.get(); + try { + ct.save(); + } catch (Exception ex) { + log(ex.getMessage()); + } + updatecontactView(); + } + + }); + } private void initializeTable() { diff --git a/src/main/java/edu/bookocontacts/model/DATASET.java b/src/main/java/edu/bookocontacts/model/DATASET.java index 50eb400..eae7f71 100644 --- a/src/main/java/edu/bookocontacts/model/DATASET.java +++ b/src/main/java/edu/bookocontacts/model/DATASET.java @@ -35,7 +35,8 @@ public interface DATASET { rs.getString("FIRST_NAME"), rs.getString("LAST_NAME"), new EmailAddress(rs.getString("EMAIL_ADDRESS")), - new PhoneNumber(rs.getString("PHONE_NUMBER"))); + new PhoneNumber(rs.getString("PHONE_NUMBER")), + new MailAddress(rs.getString("MAIL_ADDRESS"))); ct.status = EnumStatus.STORED; list.add(ct); } diff --git a/src/main/java/edu/bookocontacts/model/Factory.java b/src/main/java/edu/bookocontacts/model/Factory.java index f76550e..89e359b 100755 --- a/src/main/java/edu/bookocontacts/model/Factory.java +++ b/src/main/java/edu/bookocontacts/model/Factory.java @@ -10,14 +10,14 @@ import java.util.List; /** * */ -public interface Factory { +public final class Factory { public static List getAll(Contact clazz) { return DATASET.FINDDATA(); } static Contact createContact(Integer id, String first_name, String last_name, EmailAddress email, - PhoneNumber phone_number) { - Contact c = new Contact(first_name, last_name, email, phone_number, new MailAddress()); + PhoneNumber phone_number, MailAddress mail) { + Contact c = new Contact(first_name, last_name, email, phone_number, mail); c.setId(id); return c; diff --git a/src/main/java/edu/bookocontacts/model/MailAddress.java b/src/main/java/edu/bookocontacts/model/MailAddress.java index a23da52..cd40f41 100644 --- a/src/main/java/edu/bookocontacts/model/MailAddress.java +++ b/src/main/java/edu/bookocontacts/model/MailAddress.java @@ -1,6 +1,8 @@ package edu.bookocontacts.model; -public final class MailAddress{ +import java.util.Scanner; + +public final class MailAddress { String street; String city; @@ -8,7 +10,27 @@ public final class MailAddress{ String zip; public MailAddress() { - this("", "", "", ""); + this("", "", "", ""); + } + + public MailAddress(String addressline) { + this("", "", "", ""); + if (addressline != null) { + try (Scanner scanner = new Scanner(addressline)) { + try { + + scanner.useDelimiter(",\\s*"); + street = scanner.next(); + city = scanner.next(); + state = scanner.next(); + zip = scanner.next(); + + } catch (java.util.NoSuchElementException e) { + scanner.close(); + } + } + } + } public MailAddress(String street, String city, String state, String zip) { @@ -17,7 +39,7 @@ public final class MailAddress{ this.state = state; this.zip = zip; } - + public String getStreet() { return street; } @@ -50,12 +72,12 @@ public final class MailAddress{ this.zip = zip; } - public String getMailingAddress(){ - return String.format( "%s %s %s %s", formatField(this.street), formatField(this.city), this.state, this.zip ); + public String getMailingAddress() { + return String.format("%s %s %s %s", formatField(this.street), formatField(this.city), this.state, this.zip); } - private String formatField(String field){ - return field == null || field.isBlank()? "": field.trim() + ","; + private String formatField(String field) { + return field == null || field.isBlank() ? "" : field.trim() + ","; } @Override @@ -112,15 +134,15 @@ public final class MailAddress{ sb.append("}}"); return sb.toString(); } - + public Boolean isBlank() { - if(street.isBlank() && city.isBlank() && state.isBlank()) { - return true; - } - if( zip == null || zip.isBlank() ) { - return true; - } - return false; + if (street.isBlank() && city.isBlank() && state.isBlank()) { + return true; + } + if (zip == null || zip.isBlank()) { + return true; + } + return false; } } \ No newline at end of file