001/*******************************************************************************
002 * Copyright 2014 The MITRE Corporation
003 *   and the MIT Kerberos and Internet Trust Consortium
004 * 
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 * 
009 *   http://www.apache.org/licenses/LICENSE-2.0
010 * 
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 ******************************************************************************/
017package org.mitre.openid.connect.model;
018
019import javax.persistence.Basic;
020import javax.persistence.Column;
021import javax.persistence.Entity;
022import javax.persistence.GeneratedValue;
023import javax.persistence.GenerationType;
024import javax.persistence.Id;
025import javax.persistence.JoinColumn;
026import javax.persistence.NamedQueries;
027import javax.persistence.NamedQuery;
028import javax.persistence.OneToOne;
029import javax.persistence.Table;
030
031import com.google.gson.JsonObject;
032
033@Entity
034@Table(name="user_info")
035@NamedQueries({
036        @NamedQuery(name="DefaultUserInfo.getAll", query = "select u from DefaultUserInfo u"),
037        @NamedQuery(name="DefaultUserInfo.getByUsername", query = "select u from DefaultUserInfo u WHERE u.preferredUsername = :username"),
038        @NamedQuery(name="DefaultUserInfo.getBySubject", query = "select u from DefaultUserInfo u WHERE u.sub = :sub")
039})
040public class DefaultUserInfo implements UserInfo {
041
042        private Long id;
043        private String sub;
044        private String preferredUsername;
045        private String name;
046        private String givenName;
047        private String familyName;
048        private String middleName;
049        private String nickname;
050        private String profile;
051        private String picture;
052        private String website;
053        private String email;
054        private Boolean emailVerified;
055        private String gender;
056        private String zoneinfo;
057        private String locale;
058        private String phoneNumber;
059        private Boolean phoneNumberVerified;
060        private Address address;
061        private String updatedTime;
062        private String birthdate;
063
064
065        /**
066         * @return the id
067         */
068        @Id
069        @GeneratedValue(strategy=GenerationType.IDENTITY)
070        @Column(name = "id")
071        public Long getId() {
072                return id;
073        }
074        /**
075         * @param id the id to set
076         */
077        public void setId(Long id) {
078                this.id = id;
079        }
080        /* (non-Javadoc)
081         * @see org.mitre.openid.connect.model.UserInfo#getUserId()
082         */
083        @Override
084        @Basic
085        @Column(name="sub")
086        public String getSub() {
087                return sub;
088        }
089        /* (non-Javadoc)
090         * @see org.mitre.openid.connect.model.UserInfo#setUserId(java.lang.String)
091         */
092        @Override
093        public void setSub(String sub) {
094                this.sub = sub;
095        }
096        /* (non-Javadoc)
097         * @see org.mitre.openid.connect.model.UserInfo#getPreferredUsername
098         */
099        @Override
100        @Basic
101        @Column(name="preferred_username")
102        public String getPreferredUsername() {
103                return this.preferredUsername;
104        }
105        /* (non-Javadoc)
106         * @see org.mitre.openid.connect.model.UserInfo#setPreferredUsername(java.lang.String)
107         */
108        @Override
109        public void setPreferredUsername(String preferredUsername) {
110                this.preferredUsername = preferredUsername;
111        }
112        /* (non-Javadoc)
113         * @see org.mitre.openid.connect.model.UserInfo#getName()
114         */
115        @Override
116        @Basic
117        @Column(name = "name")
118        public String getName() {
119                return name;
120        }
121        /* (non-Javadoc)
122         * @see org.mitre.openid.connect.model.UserInfo#setName(java.lang.String)
123         */
124        @Override
125        public void setName(String name) {
126                this.name = name;
127        }
128        /* (non-Javadoc)
129         * @see org.mitre.openid.connect.model.UserInfo#getGivenName()
130         */
131        @Override
132        @Basic
133        @Column(name="given_name")
134        public String getGivenName() {
135                return givenName;
136        }
137        /* (non-Javadoc)
138         * @see org.mitre.openid.connect.model.UserInfo#setGivenName(java.lang.String)
139         */
140        @Override
141        public void setGivenName(String givenName) {
142                this.givenName = givenName;
143        }
144        /* (non-Javadoc)
145         * @see org.mitre.openid.connect.model.UserInfo#getFamilyName()
146         */
147        @Override
148        @Basic
149        @Column(name="family_name")
150        public String getFamilyName() {
151                return familyName;
152        }
153        /* (non-Javadoc)
154         * @see org.mitre.openid.connect.model.UserInfo#setFamilyName(java.lang.String)
155         */
156        @Override
157        public void setFamilyName(String familyName) {
158                this.familyName = familyName;
159        }
160        /* (non-Javadoc)
161         * @see org.mitre.openid.connect.model.UserInfo#getMiddleName()
162         */
163        @Override
164        @Basic
165        @Column(name="middle_name")
166        public String getMiddleName() {
167                return middleName;
168        }
169        /* (non-Javadoc)
170         * @see org.mitre.openid.connect.model.UserInfo#setMiddleName(java.lang.String)
171         */
172        @Override
173        public void setMiddleName(String middleName) {
174                this.middleName = middleName;
175        }
176        /* (non-Javadoc)
177         * @see org.mitre.openid.connect.model.UserInfo#getNickname()
178         */
179        @Override
180        @Basic
181        @Column(name = "nickname")
182        public String getNickname() {
183                return nickname;
184        }
185        /* (non-Javadoc)
186         * @see org.mitre.openid.connect.model.UserInfo#setNickname(java.lang.String)
187         */
188        @Override
189        public void setNickname(String nickname) {
190                this.nickname = nickname;
191        }
192        /* (non-Javadoc)
193         * @see org.mitre.openid.connect.model.UserInfo#getProfile()
194         */
195        @Override
196        @Basic
197        @Column(name = "profile")
198        public String getProfile() {
199                return profile;
200        }
201        /* (non-Javadoc)
202         * @see org.mitre.openid.connect.model.UserInfo#setProfile(java.lang.String)
203         */
204        @Override
205        public void setProfile(String profile) {
206                this.profile = profile;
207        }
208        /* (non-Javadoc)
209         * @see org.mitre.openid.connect.model.UserInfo#getPicture()
210         */
211        @Override
212        @Basic
213        @Column(name = "picture")
214        public String getPicture() {
215                return picture;
216        }
217        /* (non-Javadoc)
218         * @see org.mitre.openid.connect.model.UserInfo#setPicture(java.lang.String)
219         */
220        @Override
221        public void setPicture(String picture) {
222                this.picture = picture;
223        }
224        /* (non-Javadoc)
225         * @see org.mitre.openid.connect.model.UserInfo#getWebsite()
226         */
227        @Override
228        @Basic
229        @Column(name = "website")
230        public String getWebsite() {
231                return website;
232        }
233        /* (non-Javadoc)
234         * @see org.mitre.openid.connect.model.UserInfo#setWebsite(java.lang.String)
235         */
236        @Override
237        public void setWebsite(String website) {
238                this.website = website;
239        }
240        /* (non-Javadoc)
241         * @see org.mitre.openid.connect.model.UserInfo#getEmail()
242         */
243        @Override
244        @Basic
245        @Column(name = "email")
246        public String getEmail() {
247                return email;
248        }
249        /* (non-Javadoc)
250         * @see org.mitre.openid.connect.model.UserInfo#setEmail(java.lang.String)
251         */
252        @Override
253        public void setEmail(String email) {
254                this.email = email;
255        }
256        /* (non-Javadoc)
257         * @see org.mitre.openid.connect.model.UserInfo#getVerified()
258         */
259        @Override
260        @Basic
261        @Column(name="email_verified")
262        public Boolean getEmailVerified() {
263                return emailVerified;
264        }
265        /* (non-Javadoc)
266         * @see org.mitre.openid.connect.model.UserInfo#setVerified(java.lang.boolean)
267         */
268        @Override
269        public void setEmailVerified(Boolean emailVerified) {
270                this.emailVerified = emailVerified;
271        }
272        /* (non-Javadoc)
273         * @see org.mitre.openid.connect.model.UserInfo#getGender()
274         */
275        @Override
276        @Basic
277        @Column(name = "gender")
278        public String getGender() {
279                return gender;
280        }
281        /* (non-Javadoc)
282         * @see org.mitre.openid.connect.model.UserInfo#setGender(java.lang.String)
283         */
284        @Override
285        public void setGender(String gender) {
286                this.gender = gender;
287        }
288        /* (non-Javadoc)
289         * @see org.mitre.openid.connect.model.UserInfo#getZoneinfo()
290         */
291        @Override
292        @Basic
293        @Column(name="zone_info")
294        public String getZoneinfo() {
295                return zoneinfo;
296        }
297        /* (non-Javadoc)
298         * @see org.mitre.openid.connect.model.UserInfo#setZoneinfo(java.lang.String)
299         */
300        @Override
301        public void setZoneinfo(String zoneinfo) {
302                this.zoneinfo = zoneinfo;
303        }
304        /* (non-Javadoc)
305         * @see org.mitre.openid.connect.model.UserInfo#getLocale()
306         */
307        @Override
308        @Basic
309        @Column(name = "locale")
310        public String getLocale() {
311                return locale;
312        }
313        /* (non-Javadoc)
314         * @see org.mitre.openid.connect.model.UserInfo#setLocale(java.lang.String)
315         */
316        @Override
317        public void setLocale(String locale) {
318                this.locale = locale;
319        }
320        /* (non-Javadoc)
321         * @see org.mitre.openid.connect.model.UserInfo#getPhoneNumber()
322         */
323        @Override
324        @Basic
325        @Column(name="phone_number")
326        public String getPhoneNumber() {
327                return phoneNumber;
328        }
329        /* (non-Javadoc)
330         * @see org.mitre.openid.connect.model.UserInfo#setPhoneNumber(java.lang.String)
331         */
332        @Override
333        public void setPhoneNumber(String phoneNumber) {
334                this.phoneNumber = phoneNumber;
335        }
336        /* (non-Javadoc)
337         * @see org.mitre.openid.connect.model.UserInfo#getPhoneNumberVerified()
338         */
339        @Override
340        @Basic
341        @Column(name="phone_number_verified")
342        public Boolean getPhoneNumberVerified() {
343                return phoneNumberVerified;
344        }
345        /* (non-Javadoc)
346         * @see org.mitre.openid.connect.model.UserInfo#setPhoneNumberVerified(java.lang.Boolean)
347         */
348        @Override
349        public void setPhoneNumberVerified(Boolean phoneNumberVerified) {
350                this.phoneNumberVerified = phoneNumberVerified;
351        }
352        /* (non-Javadoc)
353         * @see org.mitre.openid.connect.model.UserInfo#getAddress()
354         */
355        @Override
356        @OneToOne
357        @JoinColumn(name="address_id")
358        public Address getAddress() {
359                return address;
360        }
361        /* (non-Javadoc)
362         * @see org.mitre.openid.connect.model.UserInfo#setAddress(org.mitre.openid.connect.model.Address)
363         */
364        @Override
365        public void setAddress(Address address) {
366                this.address = address;
367        }
368        /* (non-Javadoc)
369         * @see org.mitre.openid.connect.model.UserInfo#getUpdatedTime()
370         */
371        @Override
372        @Basic
373        @Column(name="updated_time")
374        public String getUpdatedTime() {
375                return updatedTime;
376        }
377        /* (non-Javadoc)
378         * @see org.mitre.openid.connect.model.UserInfo#setUpdatedTime(java.lang.String)
379         */
380        @Override
381        public void setUpdatedTime(String updatedTime) {
382                this.updatedTime = updatedTime;
383        }
384
385        /**
386         * @return the birthdate
387         */
388        @Override
389        @Basic
390        @Column(name="birthdate")
391        public String getBirthdate() {
392                return birthdate;
393        }
394        /**
395         * @param birthdate the birthdate to set
396         */
397        @Override
398        public void setBirthdate(String birthdate) {
399                this.birthdate = birthdate;
400        }
401
402        @Override
403        public JsonObject toJson() {
404                JsonObject obj = new JsonObject();
405
406                obj.addProperty("sub", this.getSub());
407
408                obj.addProperty("name", this.getName());
409                obj.addProperty("preferred_username", this.getPreferredUsername());
410                obj.addProperty("given_name", this.getGivenName());
411                obj.addProperty("family_name", this.getFamilyName());
412                obj.addProperty("middle_name", this.getMiddleName());
413                obj.addProperty("nickname", this.getNickname());
414                obj.addProperty("profile", this.getProfile());
415                obj.addProperty("picture", this.getPicture());
416                obj.addProperty("website", this.getWebsite());
417                obj.addProperty("gender", this.getGender());
418                obj.addProperty("zone_info", this.getZoneinfo());
419                obj.addProperty("locale", this.getLocale());
420                obj.addProperty("updated_time", this.getUpdatedTime());
421                obj.addProperty("birthdate", this.getBirthdate());
422
423                obj.addProperty("email", this.getEmail());
424                obj.addProperty("email_verified", this.getEmailVerified());
425
426                obj.addProperty("phone_number", this.getPhoneNumber());
427                obj.addProperty("phone_number_verified", this.getPhoneNumberVerified());
428
429                if (this.getAddress() != null) {
430
431                        JsonObject addr = new JsonObject();
432                        addr.addProperty("formatted", this.getAddress().getFormatted());
433                        addr.addProperty("street_address", this.getAddress().getStreetAddress());
434                        addr.addProperty("locality", this.getAddress().getLocality());
435                        addr.addProperty("region", this.getAddress().getRegion());
436                        addr.addProperty("postal_code", this.getAddress().getPostalCode());
437                        addr.addProperty("country", this.getAddress().getCountry());
438
439                        obj.add("address", addr);
440                }
441
442                return obj;
443        }
444
445        /**
446         * Parse a JsonObject into a UserInfo.
447         * @param o
448         * @return
449         */
450        public static UserInfo fromJson(JsonObject obj) {
451                DefaultUserInfo ui = new DefaultUserInfo();
452
453                ui.setSub(obj.has("sub") ? obj.get("sub").getAsString() : null);
454
455                ui.setName(obj.has("name") ? obj.get("name").getAsString() : null);
456                ui.setPreferredUsername(obj.has("preferred_username") ? obj.get("preferred_username").getAsString() : null);
457                ui.setGivenName(obj.has("given_name") ? obj.get("given_name").getAsString() : null);
458                ui.setFamilyName(obj.has("family_name") ? obj.get("family_name").getAsString() : null);
459                ui.setMiddleName(obj.has("middle_name") ? obj.get("middle_name").getAsString() : null);
460                ui.setNickname(obj.has("nickname") ? obj.get("nickname").getAsString() : null);
461                ui.setProfile(obj.has("profile") ? obj.get("profile").getAsString() : null);
462                ui.setPicture(obj.has("picture") ? obj.get("picture").getAsString() : null);
463                ui.setWebsite(obj.has("website") ? obj.get("website").getAsString() : null);
464                ui.setGender(obj.has("gender") ? obj.get("gender").getAsString() : null);
465                ui.setZoneinfo(obj.has("zone_info") ? obj.get("zone_info").getAsString() : null);
466                ui.setLocale(obj.has("locale") ? obj.get("locale").getAsString() : null);
467                ui.setUpdatedTime(obj.has("updated_time") ? obj.get("updated_time").getAsString() : null);
468                ui.setBirthdate(obj.has("birthdate") ? obj.get("birthdate").getAsString() : null);
469
470                ui.setEmail(obj.has("email") ? obj.get("email").getAsString() : null);
471                ui.setEmailVerified(obj.has("email_verified") ? obj.get("email_verified").getAsBoolean() : null);
472
473                ui.setPhoneNumber(obj.has("phone_number") ? obj.get("phone_number").getAsString() : null);
474                ui.setPhoneNumberVerified(obj.has("phone_number_verified") ? obj.get("phone_number_verified").getAsBoolean() : null);
475
476                if (obj.has("address") && obj.get("address").isJsonObject()) {
477                        JsonObject addr = obj.get("address").getAsJsonObject();
478                        ui.setAddress(new Address());
479
480                        ui.getAddress().setFormatted(addr.has("formatted") ? addr.get("formatted").getAsString() : null);
481                        ui.getAddress().setStreetAddress(addr.has("street_address") ? addr.get("street_address").getAsString() : null);
482                        ui.getAddress().setLocality(addr.has("locality") ? addr.get("locality").getAsString() : null);
483                        ui.getAddress().setRegion(addr.has("region") ? addr.get("region").getAsString() : null);
484                        ui.getAddress().setPostalCode(addr.has("postal_code") ? addr.get("postal_code").getAsString() : null);
485                        ui.getAddress().setCountry(addr.has("country") ? addr.get("country").getAsString() : null);
486
487                }
488
489
490                return ui;
491
492        }
493
494        /* (non-Javadoc)
495         * @see java.lang.Object#hashCode()
496         */
497        @Override
498        public int hashCode() {
499                final int prime = 31;
500                int result = 1;
501                result = prime * result + ((address == null) ? 0 : address.hashCode());
502                result = prime * result + ((birthdate == null) ? 0 : birthdate.hashCode());
503                result = prime * result + ((email == null) ? 0 : email.hashCode());
504                result = prime * result + ((emailVerified == null) ? 0 : emailVerified.hashCode());
505                result = prime * result + ((familyName == null) ? 0 : familyName.hashCode());
506                result = prime * result + ((gender == null) ? 0 : gender.hashCode());
507                result = prime * result + ((givenName == null) ? 0 : givenName.hashCode());
508                result = prime * result + ((id == null) ? 0 : id.hashCode());
509                result = prime * result + ((locale == null) ? 0 : locale.hashCode());
510                result = prime * result + ((middleName == null) ? 0 : middleName.hashCode());
511                result = prime * result + ((name == null) ? 0 : name.hashCode());
512                result = prime * result + ((nickname == null) ? 0 : nickname.hashCode());
513                result = prime * result + ((phoneNumber == null) ? 0 : phoneNumber.hashCode());
514                result = prime * result + ((phoneNumberVerified == null) ? 0 : phoneNumberVerified.hashCode());
515                result = prime * result + ((picture == null) ? 0 : picture.hashCode());
516                result = prime * result + ((preferredUsername == null) ? 0 : preferredUsername.hashCode());
517                result = prime * result + ((profile == null) ? 0 : profile.hashCode());
518                result = prime * result + ((sub == null) ? 0 : sub.hashCode());
519                result = prime * result + ((updatedTime == null) ? 0 : updatedTime.hashCode());
520                result = prime * result + ((website == null) ? 0 : website.hashCode());
521                result = prime * result + ((zoneinfo == null) ? 0 : zoneinfo.hashCode());
522                return result;
523        }
524
525        /* (non-Javadoc)
526         * @see java.lang.Object#equals(java.lang.Object)
527         */
528        @Override
529        public boolean equals(Object obj) {
530                if (this == obj) {
531                        return true;
532                }
533                if (obj == null) {
534                        return false;
535                }
536                if (!(obj instanceof DefaultUserInfo)) {
537                        return false;
538                }
539                DefaultUserInfo other = (DefaultUserInfo) obj;
540                if (address == null) {
541                        if (other.address != null) {
542                                return false;
543                        }
544                } else if (!address.equals(other.address)) {
545                        return false;
546                }
547                if (birthdate == null) {
548                        if (other.birthdate != null) {
549                                return false;
550                        }
551                } else if (!birthdate.equals(other.birthdate)) {
552                        return false;
553                }
554                if (email == null) {
555                        if (other.email != null) {
556                                return false;
557                        }
558                } else if (!email.equals(other.email)) {
559                        return false;
560                }
561                if (emailVerified == null) {
562                        if (other.emailVerified != null) {
563                                return false;
564                        }
565                } else if (!emailVerified.equals(other.emailVerified)) {
566                        return false;
567                }
568                if (familyName == null) {
569                        if (other.familyName != null) {
570                                return false;
571                        }
572                } else if (!familyName.equals(other.familyName)) {
573                        return false;
574                }
575                if (gender == null) {
576                        if (other.gender != null) {
577                                return false;
578                        }
579                } else if (!gender.equals(other.gender)) {
580                        return false;
581                }
582                if (givenName == null) {
583                        if (other.givenName != null) {
584                                return false;
585                        }
586                } else if (!givenName.equals(other.givenName)) {
587                        return false;
588                }
589                if (id == null) {
590                        if (other.id != null) {
591                                return false;
592                        }
593                } else if (!id.equals(other.id)) {
594                        return false;
595                }
596                if (locale == null) {
597                        if (other.locale != null) {
598                                return false;
599                        }
600                } else if (!locale.equals(other.locale)) {
601                        return false;
602                }
603                if (middleName == null) {
604                        if (other.middleName != null) {
605                                return false;
606                        }
607                } else if (!middleName.equals(other.middleName)) {
608                        return false;
609                }
610                if (name == null) {
611                        if (other.name != null) {
612                                return false;
613                        }
614                } else if (!name.equals(other.name)) {
615                        return false;
616                }
617                if (nickname == null) {
618                        if (other.nickname != null) {
619                                return false;
620                        }
621                } else if (!nickname.equals(other.nickname)) {
622                        return false;
623                }
624                if (phoneNumber == null) {
625                        if (other.phoneNumber != null) {
626                                return false;
627                        }
628                } else if (!phoneNumber.equals(other.phoneNumber)) {
629                        return false;
630                }
631                if (phoneNumberVerified == null) {
632                        if (other.phoneNumberVerified != null) {
633                                return false;
634                        }
635                } else if (!phoneNumberVerified.equals(other.phoneNumberVerified)) {
636                        return false;
637                }
638                if (picture == null) {
639                        if (other.picture != null) {
640                                return false;
641                        }
642                } else if (!picture.equals(other.picture)) {
643                        return false;
644                }
645                if (preferredUsername == null) {
646                        if (other.preferredUsername != null) {
647                                return false;
648                        }
649                } else if (!preferredUsername.equals(other.preferredUsername)) {
650                        return false;
651                }
652                if (profile == null) {
653                        if (other.profile != null) {
654                                return false;
655                        }
656                } else if (!profile.equals(other.profile)) {
657                        return false;
658                }
659                if (sub == null) {
660                        if (other.sub != null) {
661                                return false;
662                        }
663                } else if (!sub.equals(other.sub)) {
664                        return false;
665                }
666                if (updatedTime == null) {
667                        if (other.updatedTime != null) {
668                                return false;
669                        }
670                } else if (!updatedTime.equals(other.updatedTime)) {
671                        return false;
672                }
673                if (website == null) {
674                        if (other.website != null) {
675                                return false;
676                        }
677                } else if (!website.equals(other.website)) {
678                        return false;
679                }
680                if (zoneinfo == null) {
681                        if (other.zoneinfo != null) {
682                                return false;
683                        }
684                } else if (!zoneinfo.equals(other.zoneinfo)) {
685                        return false;
686                }
687                return true;
688        }
689
690}