/* * Copyright (c) 2006-2009 by Dirk Riehle, http://dirkriehle.com * * This file is part of the Wahlzeit photo rating application. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/>. */ package org.wahlzeit.model; import com.google.appengine.api.images.Image; import com.googlecode.objectify.annotation.Ignore; import com.googlecode.objectify.annotation.Subclass; import org.wahlzeit.services.EmailAddress; import org.wahlzeit.services.Language; import org.wahlzeit.services.LogBuilder; import java.util.Arrays; import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.logging.Logger; /** * A User is a client that is logged-in, that is, has registered with the system. * A user has a fair amount of information associated with it, most notably his/her photos. * Also, his/her contact information and whether the account has been confirmed. * Users can have a home page which may be elsewhere on the web. */ @Subclass(index = true) public class User extends Client { /** * */ public static final String EMAIL_ADDRESS = "emailAddress"; public static final String TERMS = "termsAndConditions"; /** * */ public static final String STATUS = "status"; public static final String RIGHTS = "accessRights"; public static final String GENDER = "gender"; public static final String NOTIFY_ABOUT_PRAISE = "notifyAboutPraise"; public static final String MEMBER_SINCE = "memberSince"; public static final String NO_PHOTOS = "noPhotos"; private static final Logger log = Logger.getLogger(User.class.getName()); /** * */ protected boolean notifyAboutPraise = true; protected Gender gender = Gender.UNDEFINED; protected UserStatus status = UserStatus.CREATED; /** * */ protected Photo userPhoto = null; protected Set<Photo> photos = new HashSet<Photo>(); @Ignore // only used as temporary variable protected Image uploadedImage = null; /** * */ protected long creationTime = System.currentTimeMillis(); /** * */ public User(String id, String myName, String myEmailAddress) { this(id, myName, EmailAddress.getFromString(myEmailAddress), null); } /** * */ public User(String id, String myName, String myEmailAddress, Client previousClient) { this(id, myName, EmailAddress.getFromString(myEmailAddress), previousClient); } /** * */ public User(String id, String nickname, EmailAddress emailAddress, Client previousClient) { initialize(id, nickname, emailAddress, AccessRights.USER, previousClient); } /** * @methodtype initialization */ protected void initialize(String id, String nickName, EmailAddress emailAddress, AccessRights accessRights, Client previousClient) { super.initialize(id, nickName, emailAddress, accessRights, previousClient); log.config(LogBuilder.createSystemMessage(). addAction("initialize user"). addParameter("id", id). addParameter("name", nickName). addParameter("E-Mail", emailAddress.asString()).toString()); incWriteCount(); } /** * */ protected User() { // do nothing } @Override protected void doSetLanguage(Language newLanguage) { for (Iterator<Photo> i = photos.iterator(); i.hasNext(); ) { Photo photo = i.next(); photo.setOwnerLanguage(language); } } /** * @methodtype boolean query */ public boolean getNotifyAboutPraise() { return notifyAboutPraise; } /** * @methodtype set */ public void setNotifyAboutPraise(boolean notify) { notifyAboutPraise = notify; for (Iterator<Photo> i = photos.iterator(); i.hasNext(); ) { Photo photo = i.next(); photo.setOwnerNotifyAboutPraise(notifyAboutPraise); } incWriteCount(); } /** * @methodtype get */ public Gender getGender() { return gender; } /** * @methodtype set */ public void setGender(Gender newGender) { gender = newGender; incWriteCount(); } /** * @methodtype boolean query */ public boolean isConfirmed() { return getStatus().isConfirmed(); } /** * @methodtype get */ public UserStatus getStatus() { return status; } /** * @methodtype set */ public void setStatus(UserStatus newStatus) { status = newStatus; incWriteCount(); } /** * @methodtype set */ public void setConfirmed() { setStatus(status.asConfirmed()); incWriteCount(); } /** * @methodtype boolean query */ public boolean hasUserPhoto() { return userPhoto != null; } /** * @methodtype get */ public Photo getUserPhoto() { return userPhoto; } /** * @methodtype set */ public void setUserPhoto(Photo newPhoto) { userPhoto = newPhoto; log.info("SetUserPhoto: " + newPhoto.getIdAsString()); incWriteCount(); } /** * @methodtype get */ public long getCreationTime() { return creationTime; } /** * @methodtype set */ public void addPhoto(Photo newPhoto) { photos.add(newPhoto); newPhoto.setOwnerId(id); newPhoto.setOwnerNotifyAboutPraise(notifyAboutPraise); newPhoto.setOwnerEmailAddress(emailAddress); newPhoto.setOwnerLanguage(language); incWriteCount(); } /** * @methodtype set */ public void removePhoto(Photo notMyPhoto) { photos.remove(notMyPhoto); incWriteCount(); } /** * @methodtype get */ public int getNoOfPhotos() { return photos.size(); } /** * @methodtype get */ public Photo[] getPhotos() { return getPhotosReverseOrderedByPraise(); } /** * @methodtype conversion */ public Photo[] getPhotosReverseOrderedByPraise() { Photo[] result = photos.toArray(new Photo[0]); Arrays.sort(result, getPhotoByPraiseReverseComparator()); return result; } /** * @methodtype get */ public static Comparator<Photo> getPhotoByPraiseReverseComparator() { return new Comparator<Photo>() { public int compare(Photo p1, Photo p2) { double sc1 = p1.getPraise(); double sc2 = p2.getPraise(); if (sc1 == sc2) { String id1 = String.valueOf(p1.getId()); String id2 = String.valueOf(p2.getId()); return id1.compareTo(id2); } else if (sc1 < sc2) { return 1; } else { return -1; } } }; } /** * @methodtype set */ public void setUploadedImage(Image image) { uploadedImage = image; } /** * @methodtype get */ public Image getUploadedImage() { return uploadedImage; } }