All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.textrecruit.ustack.data.AddressBook Maven / Gradle / Ivy

There is a newer version: 1.0.11
Show newest version
package com.textrecruit.ustack.data;

import com.mongodb.*;
import com.textrecruit.ustack.exceptions.InvalidSiteAccountName;
import com.textrecruit.ustack.exceptions.InvalidUserAccountName;
import com.textrecruit.ustack.main.UAppCfg;
import com.textrecruit.ustack.main.UOpts;
import org.apache.log4j.Logger;
import org.bson.types.ObjectId;

import java.util.*;

/**
 * The address book object allows you to manage an address book per user.
 * 
 * An address book can 'subscribe' to other address books for common address book access
 * 
 * @author jdanner
 *
 */
public class AddressBook extends UntzDBObject {

	private static final long serialVersionUID = 1L;
	private static Logger logger = Logger.getLogger(AddressBook.class);
	
	public String getCollectionName() { return "addressBooks"; }
	
	public static DBCollection getDBCollection() {
		return new AddressBook().getCollection();
	}

	/** Do not use */
	private AddressBook() {}
	
	private AddressBook(String name)
	{
		// setup basic values on account
		setName(name);
		put("created", new Date());
		entries = new Vector();
	}

	public String getAddressBookId() {
		return get("_id") + "";
	}

	/** Return the name of the database that houses the 'users' collection */
	public static final String getDatabaseName() {
		
		if (UOpts.getString(UAppCfg.DATABASE_ADDRBOOK_COL) != null)
			return UOpts.getString(UAppCfg.DATABASE_ADDRBOOK_COL);
		
		return UOpts.getAppName();
		
	}
	
	public void setName(String name) {
		put("name", name);
	}
	
	public String getName() {
		return getString("name");
	}

	/**
	 * Generate a AddressBook object from the MongoDB object
	 * @param object
	 */
	public AddressBook(DBObject object) {
		super(object);
		
		entries = new Vector();
		reloadEntries();
	}

	/**
	 * Reloads all the address book entries and subscription values
	 */
	private void reloadEntries()
	{
		entries.clear();

		boolean needSave = false;
		// load entries from this address book
		loadAll(this);
		
		// load entries from subscribed address books
		BasicDBList subscrList = getSubscriptionList();
		for (int i = 0; i < subscrList.size(); i++)
		{
			DBObject map = (DBObject)subscrList.get(i);
			String id = (String)map.get("addrBookId");
			if (id.equalsIgnoreCase(getAddressBookId())) // don't try to load myself
				continue;
			
			AddressBook subscribedBook = AddressBook.getById( id );
			if (subscribedBook != null && !subscribedBook.getAddressBookId().equalsIgnoreCase(getAddressBookId()))
			{
				logger.info("Loading Subscribed Book '" + subscribedBook.getAddressBookId() + "'");
				loadAll(subscribedBook);
			}
			else
			{
				logger.info("Removing subscribed address book '" + map.get("addrBookId") + "/" + map.get("name") + "' -- it does not exist (Removed from '" + get("_id") + "'");
				subscrList.remove(i);
				needSave = true;
				i--;
			}
		}

		if (needSave)
			save();
	}
	
	private List entries;
	
	public List getEntries() {
		return entries;
	}
	
	public AddressBookEntry getEntryByInternalLinkId(String id) {

		if (id == null)
			return null;
		
		for (AddressBookEntry a : entries)
		{
			if (id.equalsIgnoreCase( a.getLink() ))
				return a;
		}

		return null;
	}
	
	public List getRecent(String userName, String type, int count)
	{
		List ret = new Vector();
		
		Collections.sort(entries, new LastUsedByUser(userName));
		
		for (int i = 0; ret.size() < count && i < entries.size(); i++)
		{
			if (type.equalsIgnoreCase(entries.get(i).getType()))
				ret.add(entries.get(i));
		}
		
		return ret;
	}
	
	public class LastUsedByUser implements Comparator {
		
		private String userName;
		
		public LastUsedByUser(String user) { 
			userName = user;
		}

		public int compare(AddressBookEntry o1, AddressBookEntry o2) {
			
			Date lu1 = o1.getLastUsed(userName);
			Date lu2 = o2.getLastUsed(userName);
			
			if (lu1 == null && lu2 == null)
				return 0;
			
			if (lu1 == null)
				return 1;
			
			if (lu2 == null)
				return -1;
			
			if (lu1.after(lu2))
				return -1;
			
			return 1;
		}
		
	}
	
	public BasicDBList getEntryList() {
		BasicDBList ret = (BasicDBList)get("entryList");
		if (ret == null)
			ret = new BasicDBList();
		
		return ret;
	}
	
	public void setEntryList(BasicDBList list)
	{
		put("entryList", list);
	}

	/**
	 * Subscribes this address book to another address book
	 * 
	 * @param existingBook
	 * @param actor
	 */
	public void subscribeTo(AddressBook existingBook, String actor)
	{
		BasicDBList subList = getSubscriptionList();
		boolean found = false;
		for (int i = 0; i < subList.size(); i++)
		{
			DBObject map = (DBObject)subList.get(i);
			AddressBook subscribedBook = AddressBook.getById( (String)map.get("addrBookId") );
			if (subscribedBook != null)
			{
				found = true;
				map.put("name", subscribedBook.getName());
			}
		}

		if (!found && !existingBook.getAddressBookId().equalsIgnoreCase(getAddressBookId()))
		{
			DBObject map = new BasicDBObject("addrBookId", existingBook.getAddressBookId());
			map.put("name", existingBook.getName());
			map.put("created", new Date());
			map.put("subscribedBy", actor);
			subList.add(map);
		}
		
		setSubscriptionList(subList);
		
		loadAll(existingBook);
	}

	/**
	 * Unsubscribes this address book from another address book
	 * @param existingBook
	 */
	public void unsubscribeFrom(AddressBook existingBook)
	{
		BasicDBList subList = getSubscriptionList();
		for (int i = 0; i < subList.size(); i++)
		{
			DBObject map = (DBObject)subList.get(i);
			if (existingBook.getAddressBookId().equalsIgnoreCase( (String)map.get("addrBookId") ))
			{
				subList.remove(i);
				i--;
			}
		}
		setSubscriptionList(subList);
		
		reloadEntries();
	}
	
	public BasicDBList getSubscriptionList() {
		BasicDBList ret = (BasicDBList)get("subscrList");
		if (ret == null)
			ret = new BasicDBList();
		
		return ret;
	}
	
	public void setSubscriptionList(BasicDBList list)
	{
		put("subscrList", list);
	}

	private void loadAll(AddressBook book)
	{
		if (book == null)
			return;
		
		BasicDBList entryList = book.getEntryList();
		logger.info("Loading " + entryList.size() + " entries from book '" + book.getAddressBookId() + "'");
		for (int i = 0; i < entryList.size(); i++)
		{
			AddressBookEntry entry = new AddressBookEntry((DBObject)entryList.get(i));
			entry.put("srcAddrBookId", book.getAddressBookId());
			loadEntry(entry);
		}
	}
	
	/**
	 * Loads the entry to the in-memory address book (this is where subscribed address books are loaded)
	 * 
	 * @param entry
	 */
	private boolean loadEntry(AddressBookEntry entry)
	{
		String matchCheck = entry.getMatch();
		for (AddressBookEntry curEntry : entries)
		{
			if (matchCheck.equalsIgnoreCase( curEntry.getMatch() )) // already have it in this address book
			{
				if (getAddressBookId().equalsIgnoreCase(entry.getString("srcAddrBookId")))
				{
					// update display name text
					BasicDBList entryList = getEntryList();
					for (int i = 0; i < entryList.size(); i++)
					{
						DBObject chk = (DBObject)entryList.get(i);
						if (entry.getMatch().equalsIgnoreCase( (String)chk.get("match") ))
						{
							chk.put("type", entry.get("type"));
							chk.put("displayVal", entry.getString("displayVal"));
							curEntry.setDisplayValue(entry.getString("displayVal"));
						}
					}
					setEntryList(entryList);
				}
				
				return false;
			}
		}
		
		entries.add(entry);
		return true;
	}

	/**
	 * Adds an entry to this address book, checks for existing matching entries first
	 * @param entry
	 */
	public void addEntry(AddressBookEntry entry)
	{
		if (loadEntry(entry))
		{
			BasicDBList entryList = getEntryList();
			entryList.add(entry);
			setEntryList(entryList);
		}
	}
	
	public void updateEntry(AddressBookEntry entry)
	{
		BasicDBList entryList = getEntryList();
		boolean found = false;
		for (int i = 0; !found && i < entryList.size(); i++)
		{
			DBObject test = (DBObject)entryList.get(i);
			if (entry.getType().equalsIgnoreCase( (String)test.get("type") ) && entry.getMatch().equalsIgnoreCase( (String)test.get("match") ))
			{
				found = true;
				entryList.set(i, entry);
				logger.info("Found match for entry [" + entry.getMatch() + "] at " + i);
			}
		}

		if (!found)
		{
			logger.info("Unable to find match for entry [" + entry.getMatch() + "] => Adding");
			entryList.add(entry);
		}
		
		setEntryList(entryList);
	}

	/**
	 * Removes an entry from this address book only (not subscribed books)
	 * @param entry
	 */
	public void removeEntry(AddressBookEntry entry)
	{
		BasicDBList entryList = getEntryList();
		for (int i = 0; i < entryList.size(); i++)
		{
			DBObject chk = (DBObject)entryList.get(i);
			if (entry.getMatch().equalsIgnoreCase( (String)chk.get("match") ))
			{
				entryList.remove(i);
				i--;
			}
		}
	}
	
	public AddressBookEntry getByGroupId(String groupId)
	{
		if (groupId == null)
			return null;
		
		groupId = groupId.trim();
		
		List entries = getEntries();
		for (AddressBookEntry e : entries)
		{
			if (groupId.equalsIgnoreCase((String)e.get("groupId")))
				return e;
		}
		
		return null;

	}
	
	public AddressBookEntry getEntryByDisplayName(String name)
	{
		if (name == null)
			return null;
		
		name = name.trim();
		
		List entries = getEntries();
		for (AddressBookEntry e : entries)
		{
			if (e.getDisplayValue().equalsIgnoreCase(name))
				return e;
		}
		
		return null;
	}

	/**
	 * Updates an entry's usage time
	 * @param match
	 * @param actor
	 */
	public void updateUsage(String match, String displayVal, String actor)
	{
		BasicDBList entryList = getEntryList();
		for (int i = 0; i < entryList.size(); i++)
		{
			DBObject chk = (DBObject)entryList.get(i);
			if (match.equalsIgnoreCase( (String)chk.get("match") ))
			{
				AddressBookEntry entry = new AddressBookEntry(chk);
				entry.setDisplayValue(displayVal);
				entry.markUsed(actor);
				entryList.set(i, entry);
			}
		}
		setEntryList(entryList);
	}
	
	/**
	 * Get a address book by id
	 * 
	 * @param id
	 * @return
	 */
	public static AddressBook getById(String id)
	{
		if (id == null)
			return null;
		
		DBObject book = new AddressBook().getCollection().findOne(BasicDBObjectBuilder.start("_id", new ObjectId(id)).get());
		
		if (book == null)
			return null;
		
		return new AddressBook(book);
	}

	/**
	 * Get a address book by siteId
	 * @param siteId
	 * @return
	 * @throws InvalidSiteAccountName
	 */
	public static AddressBook getBySiteId(String siteId) throws InvalidSiteAccountName
	{
		if (siteId == null)
			return null;
		
		DBObject book = new AddressBook().getCollection().findOne(BasicDBObjectBuilder.start("siteId", siteId).get());
		
		if (book == null)
		{
			SiteAccount site = SiteAccount.getSiteById(siteId);
			if (site == null)
				throw new InvalidSiteAccountName("Unknown ID");
			
			AddressBook newBook = new AddressBook(site.getSiteName());
			newBook.put("siteId", siteId);
			return newBook;
		}
		
		return new AddressBook(book);
	}
	
	/**
	 * Get a address book by userId
	 * @param userId
	 * @return
	 * @throws InvalidUserAccountName
	 */
	public static AddressBook getByUserId(String userId) throws InvalidUserAccountName
	{
		if (userId == null)
			return null;
		
		DBObject book = new AddressBook().getCollection().findOne(BasicDBObjectBuilder.start("userId", userId).get());
		
		if (book == null)
		{
			UserAccount user = UserAccount.getUserById(userId);
			if (user == null)
				throw new InvalidUserAccountName("Unknown ID");
			
			AddressBook newBook = new AddressBook(user.getUserName());
			newBook.put("userId", userId);
			return newBook;
		}
		
		return new AddressBook(book);
	}
	
	/**
	 * Get a address book by name
	 * @param name
	 * @return
	 */
	public static AddressBook getByName(String name)
	{
		if (name == null)
			return null;
		
		DBObject book = new AddressBook().getCollection().findOne(BasicDBObjectBuilder.start("name", name).get());
		
		if (book == null)
			return new AddressBook(name);
		
		return new AddressBook(book);
	}
	
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy