/** * Copyright (C) 2010 Peter Karich <jetwick_@_pannous_._info> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.jetwick.data; import de.jetwick.es.SavedSearch; import de.jetwick.tw.TwitterSearch; import java.io.Serializable; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import twitter4j.Status; import twitter4j.Tweet; import twitter4j.User; /** * * @author Peter Karich, peat_hal 'at' users 'dot' sourceforge 'dot' net */ public class JUser implements DbObject, Serializable { private static final long serialVersionUID = 1L; public static int OUT_OF_DATE_DAYS = 7; public static int DISPLAY_TWEETS = 2; public static final String UPDATE_AT = "updateAt"; public static final String OWN_TWEETS = "ownTweets"; public static final String SCREEN_NAME = "screenName"; public static String ROLE_ADMIN = "admin"; public static String ROLE_USER = "user"; //public static String MODE_SMART = "smartread"; private Collection<JTweet> ownTweets = new LinkedHashSet<JTweet>(8); private Map<Long, SavedSearch> savedSearches = new LinkedHashMap<Long, SavedSearch>(); private Date lastFriendsUpdate; private Collection<String> friends; private String realName; // we don't need an index here -> already via uniqueconstraint private String screenName; private Long twitterId; private String profileImageUrl; private String webUrl; private String location; private Set<String> langs = new LinkedHashSet<String>(4); private String description; private Date createdAt; private Date twitterCreatedAt; private Date lastVisit; private int followersCount = 0; private int friendsCount = 0; private Set<String> tags = new LinkedHashSet<String>(4); private Map<String, Date> topics = new LinkedHashMap<String, Date>(4); private String twitterTokenSecret; private String twitterToken; private String role = ROLE_USER; private String email; private String mode; private boolean weekFallback = true; private boolean isProtected = false; private boolean active = true; public JUser() { setCreatedAt(new Date()); } public JUser(String name) { this(); this.screenName = name.toLowerCase(); if (screenName.trim().length() == 0) throw new IllegalArgumentException("Screenname must not be empty!"); } public JUser(User u) { this(u.getScreenName()); updateFieldsBy(u); } @Override public String getId() { return getScreenName(); } public boolean isActive() { return active; } public JUser setActive(boolean active) { this.active = active; return this; } public void setWeekFallback(boolean weekFallback) { this.weekFallback = weekFallback; } public boolean isWeekFallback() { return weekFallback; } public JUser setMode(String mode) { this.mode = mode; return this; } public String getMode() { return mode; } public Date getLastVisit() { return lastVisit; } public JUser setLastVisit(Date lastVisit) { this.lastVisit = lastVisit; return this; } public Collection<String> getTags() { return tags; } public void addTag(String tag) { tags.add(tag); } public String getTwitterToken() { return twitterToken; } public JUser setTwitterToken(String twitterToken) { this.twitterToken = twitterToken; return this; } public String getTwitterTokenSecret() { return twitterTokenSecret; } public JUser setTwitterTokenSecret(String twitterTokenSecret) { this.twitterTokenSecret = twitterTokenSecret; return this; } /** * This method refreshes the properties of this user by the specified * Twitter4j user * @param user */ public Status updateFieldsBy(User user) { twitterId = user.getId(); setProtected(user.isProtected()); setTwitterCreatedAt(user.getCreatedAt()); setDescription(user.getDescription()); addLanguage(user.getLang()); setLocation(TwitterSearch.toStandardLocation(user.getLocation())); setRealName(user.getName()); // user.getFollowersCount(); // user.getFriendsCount(); // user.getTimeZone() if (user.getProfileImageURL() != null) setProfileImageUrl(user.getProfileImageURL().toString()); if (user.getURL() != null) setWebUrl(user.getURL().toString()); setFollowersCount(user.getFollowersCount()); setFriendsCount(user.getFriendsCount()); return user.getStatus(); } public void setFollowersCount(int followersCount) { this.followersCount = followersCount; } public void setFriendsCount(int friendsCount) { this.friendsCount = friendsCount; } public int getFollowersCount() { return followersCount; } public int getFriendsCount() { return friendsCount; } public void setTwitterCreatedAt(Date twitterCreatedAt) { this.twitterCreatedAt = twitterCreatedAt; } public Date getTwitterCreatedAt() { return twitterCreatedAt; } public Date getCreatedAt() { return createdAt; } public JUser setCreatedAt(Date createdAt) { this.createdAt = createdAt; return this; } public String getEmail() { return email; } public JUser setEmail(String email) { this.email = email; return this; } public void setRole(String role) { this.role = role; } public String getRole() { return role; } public void addLanguage(String lang) { langs.add(lang); } public Collection<String> getLanguages() { return langs; } public boolean isAdmin() { return ROLE_ADMIN.equals(role); } public Long getTwitterId() { return twitterId; } public void setTwitterId(long id) { this.twitterId = id; } public String getScreenName() { return screenName; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getLocation() { return location; } public JUser setLocation(String location) { this.location = location; return this; } public String getProfileImageUrl() { return profileImageUrl; } public void setProfileImageUrl(String profileImageUrl) { this.profileImageUrl = profileImageUrl; } public String getRealName() { return realName; } public void setRealName(String realName) { this.realName = realName; } public String getWebUrl() { return webUrl; } public void setWebUrl(String webUrl) { this.webUrl = webUrl; } @Override public String toString() { return screenName; } public JUser init(Tweet tw) { setProfileImageUrl(tw.getProfileImageUrl()); setLocation(TwitterSearch.toStandardLocation(tw.getLocation())); return this; } public void addSavedSearch(SavedSearch ss) { savedSearches.put(ss.getId(), ss); } public boolean removeSavedSearch(long ssId) { return savedSearches.remove(ssId) != null; } public SavedSearch getSavedSearch(long id) { return savedSearches.get(id); } public Collection<SavedSearch> getSavedSearches() { return savedSearches.values(); } public void addOwnTweet(JTweet tw) { addOwnTweet(tw, true); } public void addOwnTweet(JTweet tw, boolean reverse) { ownTweets.add(tw); // dirtyOwnTweets = true; if (reverse) tw.setFromUser(this, false); } @Override public JUser setVersion(long v) { // this.version = v; return this; } @Override public long getVersion() { return 0; } public Collection<JTweet> getOwnTweets() { // if (dirtyOwnTweets) { // SolrTweet.deduplicate(ownTweets); // dirtyOwnTweets = false; // } return Collections.unmodifiableCollection(ownTweets); } public JUser updateTopic(String topic, Date date) { topics.put(topic, date); return this; } public JUser setTopics(List<String> topicList) { Map<String, Date> oldTopics = topics; topics = new LinkedHashMap<String, Date>(topics.size()); for (String topic : topicList) { Date date = oldTopics.get(topic); topics.put(topic, date); } return this; } public Collection<String> getTopics() { return topics.keySet(); } public Map<String, Date> getTopicsMap() { return topics; } public Collection<String> getFriends() { if (friends == null) return Collections.EMPTY_LIST; return friends; } public JUser setFriends(Collection<String> friends) { this.friends = friends; return this; } public Date getLastFriendsUpdate() { return lastFriendsUpdate; } public void setLastFriendsUpdate(Date lastFriendsUpdate) { this.lastFriendsUpdate = lastFriendsUpdate; } public void setProtected(boolean aProtected) { isProtected = aProtected; } public boolean isProtected() { return isProtected; } @Override public boolean equals(Object obj) { if (obj == null) return false; if (getClass() != obj.getClass()) return false; final JUser other = (JUser) obj; if ((this.screenName == null) ? (other.screenName != null) : !this.screenName.equals(other.screenName)) return false; return true; } @Override public int hashCode() { int hash = 7; hash = 61 * hash + (this.screenName != null ? this.screenName.hashCode() : 0); return hash; } }