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

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

The newest version!
package com.textrecruit.ustack.data;

import com.mongodb.*;
import com.textrecruit.ustack.aaa.LinkActionHelper;
import com.textrecruit.ustack.aaa.ResourceDefinition;
import com.textrecruit.ustack.aaa.ResourceLink;
import com.textrecruit.ustack.aaa.RoleDefinition;
import com.textrecruit.ustack.exceptions.ObjectExistsException;
import com.textrecruit.ustack.main.UFile;
import com.textrecruit.ustack.main.UOpts;
import com.textrecruit.ustack.uisupport.FieldValueMap;
import com.textrecruit.ustack.uisupport.SearchTableHeaderInt;
import com.textrecruit.ustack.uisupport.TablePagerInt;
import org.apache.log4j.Logger;

import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;

/**
 * Base Object
 * 
 * @author jdanner
 *
 */
abstract public class UntzDBObject extends BasicDBObject implements DBObject {

	private static Logger logger = Logger.getLogger(UntzDBObject.class);
	private static final long serialVersionUID = 1L;
	abstract public String getCollectionName();
	public static final String TYPE_CSV = "csv";
	
	protected UntzDBObject() {}

	/**
	 * Base Constructor
	 * 
	 * @param obj
	 */
	public UntzDBObject(DBObject obj)
	{
		super();
		putAll(obj);
	}
	
	public void update(String actor, DBObject updates)
	{
		DBCollection coll = getCollection();
		
		DBObject partial = new BasicDBObject();
		partial.putAll(updates);
		partial.put("updatedBy", actor);
		partial.put("updated", new Date());
		
		BasicDBObject updateObj = new BasicDBObject();
		updateObj.put("$set", partial);
		
		logger.info("Updating [" + get("_id") + "] => " + partial);
		
		coll.update(new BasicDBObject("_id", get("_id")), updateObj);
	}

	/**
	 * Save an object, provide username or system component that updated the object
	 * 
	 * @param actor
	 */
	public void save(String actor)
	{
		DBCollection coll = getCollection();
		put("updatedBy", actor);
		put("updated", new Date());
		coll.save(this);
		cache();
	}

	/**
	 * Save an object
	 */
	protected void save()
	{
		getCollection().save(this);
	}

	/**
	 * Delete an object
	 */
	public void delete()
	{
		getCollection().remove(this);
		decache();
	}

	/**
	 * Returns the MongoDB collection for this class
	 * @return
	 */
	public DBCollection getCollection()
	{
		DBCollection coll = MongoDB.getCollection(getDatabaseName(), getCollectionName());
		return coll;
	}
	
	/** Remove a resource link by index */
	public void removeResourceLinkIdx(String actor, int idx)
	{
		BasicDBList list = getResourceLinkList();
		DBObject resourceLink = (DBObject)list.get(idx);
		
		LinkActionHelper.handleLinkRemoveAction(new ResourceLink(resourceLink), this);
		list.remove(idx);
		setResourceLinkList(list);
		calculateManageLists();

		DBObject event = new BasicDBObject("link", resourceLink);
		addIdentifier(event);
		AuditLog.log("core", actor, "RemoveResourceLink", event);
	}

	/** Returns the list of resource links */
	public BasicDBList getResourceLinkList()
	{
		BasicDBList ret = (BasicDBList)get("resourceLinkList");
		if (ret == null)
			ret = new BasicDBList();
		
		return ret;
	}
	
	private void setResourceLinkList(BasicDBList list)
	{
		put("resourceLinkList", list);
	}
	
	public void removeResourceLinks(String actor, ResourceDefinition resDef, String role)
	{
		BasicDBList list = getResourceLinkList();
		for (int i = 0; i < list.size(); i++)
		{
			DBObject resLink = (DBObject)list.get(i);
			String linkResDefId = (String)resLink.get("resDefId");
			String resDefId = resDef.get("_id") + "";
			
			if (linkResDefId.equalsIgnoreCase(resDefId))
			{
				if (role.equalsIgnoreCase( (String)resLink.get("role") ))
				{
					LinkActionHelper.handleLinkRemoveAction(new ResourceLink(resLink), this);
					list.remove(i);
					i--;
					
					DBObject event = new BasicDBObject("link", resLink);
					addIdentifier(event);
					AuditLog.log("core", actor, "RemoveResourceLink", event);
				}
			}
		}
		setResourceLinkList(list);
		calculateManageLists();
	}
	
	public void removeResourceLinks(String actor, ResourceDefinition resDef)
	{
		BasicDBList list = getResourceLinkList();
		for (int i = 0; i < list.size(); i++)
		{
			DBObject resLink = (DBObject)list.get(i);
			String linkResDefId = (String)resLink.get("resDefId");
			String resDefId = resDef.get("_id") + "";
			
			if (linkResDefId.equalsIgnoreCase(resDefId))
			{
				LinkActionHelper.handleLinkRemoveAction(new ResourceLink(resLink), this);
				list.remove(i);
				i--;
				
				DBObject event = new BasicDBObject("link", resLink);
				addIdentifier(event);
				AuditLog.log("core", actor, "RemoveResourceLink", event);
			}
		}
		setResourceLinkList(list);
		calculateManageLists();
	}

	/**
	 * Adds a resourceLink to the current definition if the object doesn't have a matching resource link already
	 * @param resourceLink
	 */
	public void addResourceLinkIfNeeded(String actor, ResourceLink resourceLink) {
		
		if (hasResourceLink(resourceLink))
			return;

		logger.debug("Adding ResourceLink => " + ((DBObject)resourceLink).toString());
		addResourceLink(actor, resourceLink);
	}
	
	public boolean hasResourceLink(ResourceLink resourceLink) {
		
		String resDefId = resourceLink.getString("resDefId");
		String role = resourceLink.getString("role");
		String siteId = resourceLink.getString("siteId");
		String userName = resourceLink.getString("userName");
		
		BasicDBList resList = getResourceLinkList();
		for (int i = 0; i < resList.size(); i++)
		{
			DBObject obj = (DBObject)resList.get(i);
			
			String linkResDefId = (String)obj.get("resDefId");
			if (!linkResDefId.equalsIgnoreCase(resDefId))
				continue;
			
			if (!role.equalsIgnoreCase( (String)obj.get("role") ))
				continue;

			if (siteId != null && siteId.equalsIgnoreCase( (String)obj.get("siteId") ))
			{
				logger.debug("\t- Matched [" + obj + "  ==>  " + ((DBObject)resourceLink).toString());
				return true;
			}

			if (userName != null && userName.equalsIgnoreCase( (String)obj.get("userName") ))
			{
				logger.debug("\t- Matched [" + obj + "  ==>  " + ((DBObject)resourceLink).toString());
				return true;
			}
			
			// compare all items on the incoming resource link object to the existing object -- match?
			Iterator it = resourceLink.keySet().iterator();
			boolean match = false;
			if (it.hasNext())
				match = true;
			
			while (it.hasNext() && match)
			{
				String key = it.next();
				if (!"created".equalsIgnoreCase(key))
				{
					Object val1 = resourceLink.get(key);
					Object val2 = obj.get(key);
					if (!val1.equals(val2))
					{
						match = false;
					}
								
				}
			}

			if (match){
				logger.debug("\t- Matched [" + obj + "  ==>  " + ((DBObject)resourceLink).toString());
				return true;
			}
		}

		return false;
	}
	
	/**
	 * Adds a resourceLink to the current definition
	 * 
	 * @param resourceLink
	 * @throws ObjectExistsException
	 */
	public void addResourceLink(String actor, ResourceLink resourceLink) {

		LinkActionHelper.handleLinkAddAction(actor, resourceLink, this);

		BasicDBList resourceLinkList = getResourceLinkList();
		resourceLinkList.add(resourceLink);
		setResourceLinkList(resourceLinkList);

		DBObject event = new BasicDBObject("link", resourceLink);
		addIdentifier(event);
		AuditLog.log("core", actor, "AddResourceLink", event);


		calculateManageLists();
	}
	
	public void addIdentifier(DBObject auditLogEvent)
	{
		if (get("userName") != null)
			auditLogEvent.put("userName", get("userName"));
		if (get("siteId") != null)
			auditLogEvent.put("siteId", get("siteId"));
		if (get("clientId") != null)
			auditLogEvent.put("clientId", get("clientId"));
	}
	
	public void clearManagedBy()
	{
		removeField("managedByList");
	}

	/** Returns a comma-separated string of roles */
	public String getManagedByListString()
	{
		StringBuffer res = new StringBuffer();
		
		BasicDBList mgdByList = getManagedByList();
		for (int i = 0; i < mgdByList.size(); i++)
		{
			String mb = (String)mgdByList.get(i);
			res.append(mb);
			if ((i + 1) < mgdByList.size())
				res.append(",");
		}		
		
		return res.toString();
	}
	
	/** Resets and rebuilds the manage and can manage lists */
	protected void calculateManageLists()
	{
		setCanManageList(new BasicDBList());
		setManagedByList(new BasicDBList());
		
		BasicDBList resourceLinkList = getResourceLinkList();
		for (int q = 0; q < resourceLinkList.size(); q++)
		{
			ResourceLink resourceLink = new ResourceLink( (DBObject)resourceLinkList.get(q) );
			
			ResourceDefinition rdef = resourceLink.getResourceDefinition();
			if (rdef != null)
			{
				BasicDBList managedByList = rdef.getManagedByList();
				for (int i = 0; i < managedByList.size(); i++)
					addManagedBy( (String)managedByList.get(i) );

				BasicDBList resLinkMgBy = (BasicDBList)resourceLink.get("managedBy");
				for (int i = 0; resLinkMgBy != null && i < resLinkMgBy.size(); i++)
				{
					String mgmtBy = (String)resLinkMgBy.get(i);
					addManagedBy( mgmtBy );
				}

				BasicDBList canManageList = rdef.getCanManageList();
				for (int i = 0; i < canManageList.size(); i++)
					addCanManage( (String)canManageList.get(i) );
			}			
		}
	}

	/** Check if this object can be 'managedBy' the provided String */
	public boolean hasManagedBy(String managedBy)
	{
		BasicDBList mgdByList = getCanManageList();
		for (int i = 0; i < mgdByList.size(); i++)
			if (managedBy.equalsIgnoreCase( (String)mgdByList.get(i) ))
				return true;
			
		return false;
	}

	/** Removes a managed by item */
	public void removeManagedBy(String managedBy)
	{
		BasicDBList mgdByList = getCanManageList();
		for (int i = 0; i < mgdByList.size(); i++)
			if (managedBy.equalsIgnoreCase( (String)mgdByList.get(i) ))
			{
				mgdByList.remove(i);
				i--;
			}
	}
	
	/** Add a managedBy entry */
	public void addManagedBy(String managedBy)
	{
		if (managedBy == null)
			return;
		
		managedBy = managedBy.trim();
		
		BasicDBList mgdByList = getManagedByList();
		for (int i = 0; i < mgdByList.size(); i++)
		{
			String mb = (String)mgdByList.get(i);
			if (mb.equalsIgnoreCase(managedBy))
				return;
		}
		
		mgdByList.add(managedBy);
		setManagedByList(mgdByList);
	}

	/** Get the managedBy list */
	public BasicDBList getManagedByList()
	{
		BasicDBList ret = (BasicDBList)get("managedByList");
		if (ret == null)
			ret = new BasicDBList();
		
		return ret;
	}

	/** Set the managedBy list */
	protected void setManagedByList(BasicDBList list)
	{
		put("managedByList", list);
	}

	/** Get the canManage list as a $in mongodb search object */
	public DBObject getCanManageSearch()
	{
		return BasicDBObjectBuilder.start("managedByList", BasicDBObjectBuilder.start("$in", getCanManageArray()).get()).get();
	}

	/** Add a canManage entry */
	public void addCanManage(String canManage)
	{
		if (canManage == null || canManage.length() == 0)
			return;
		
		canManage = canManage.trim();
		
		BasicDBList canMgList = getCanManageList();
		for (int i = 0; i < canMgList.size(); i++)
		{
			String mb = (String)canMgList.get(i);
			if (mb.equalsIgnoreCase(canManage))
				return;
		}
		
		canMgList.add(canManage);
		setCanManageList(canMgList);
	}

	/** Get the canManage list as an array */
	public String[] getCanManageArray()
	{
		BasicDBList canMgList = getCanManageList();
		String[] ret = new String[canMgList.size()];

		for (int i = 0; i < canMgList.size(); i++)
			ret[i] = (String)canMgList.get(i);
		
		return ret;
	}

	/** Returns a comma-separated string of roles */
	public String getCanManageListString()
	{
		StringBuffer res = new StringBuffer();
		
		BasicDBList canMgList = getCanManageList();
		for (int i = 0; i < canMgList.size(); i++)
		{
			String mb = (String)canMgList.get(i);
			res.append(mb);
			if ((i + 1) < canMgList.size())
				res.append(",");
		}		
		
		return res.toString();
	}

	/** Determines if this use can manage based on the list of managedby items sent in */
	public boolean hasCanManage(BasicDBList list)
	{
		if (list == null)
			return true;

		BasicDBList canMgList = getCanManageList();
		for (int j = 0; j < list.size(); j++)
		{
			String canManage = (String)list.get(j);
			for (int i = 0; i < canMgList.size(); i++)
				if (canManage.equalsIgnoreCase( (String)canMgList.get(i) ))
					return true;
		}		
		return false;
	}
	
	/** Determines if this use can manage based on the string */
	public boolean hasCanManage(String canManage)
	{
		BasicDBList canMgList = getCanManageList();
		for (int i = 0; i < canMgList.size(); i++)
			if (canManage.equalsIgnoreCase( (String)canMgList.get(i) ))
				return true;
			
		return false;
	}

	/** Returns the list of Strings that the user 'can manage' */
	public BasicDBList getCanManageList()
	{
		BasicDBList ret = (BasicDBList)get("canManageList");
		if (ret == null)
			ret = new BasicDBList();
		
		return ret;
	}

	/** Sets the canManage list */
	private void setCanManageList(BasicDBList list)
	{
		put("canManageList", list);
	}

	/**
	 * Determines if the resourceLink (by name) already exists for this resource
	 * @param resourceLinkName
	 * @return
	 */
	public boolean hasResourceLink(String resourceLinkName) {
		
		if (getResourceLinkByName(resourceLinkName) != null)
			return true;
		
		return false;
	}

	/** Determines if the user has the provided resource link (full name) */
	public boolean hasResourceLinkFullName(String resourceLinkName)
	{
		BasicDBList resourceLinkList = getResourceLinkList();
		for (int i = 0; i < resourceLinkList.size(); i++)
		{
			DBObject resourceLink = (DBObject)resourceLinkList.get(i);
			String rn = (String)resourceLink.get("name");
			if (rn.equalsIgnoreCase(resourceLinkName))
				return true;
		}
		return false;
	}


	
	/** Returns the list of tos and approvals */
	public BasicDBList getTermsConditions()
	{
		BasicDBList ret = (BasicDBList)get("tosList");
		if (ret == null)
			ret = new BasicDBList();
		
		return ret;
	}
	
	public int getRoleLevel(ResourceDefinition def)
	{
		int curMax = 10000;
		BasicDBList resourceLinkList = getResourceLinkList();
		for (int i = 0; i < resourceLinkList.size(); i++)
		{
			DBObject resourceLink = (DBObject)resourceLinkList.get(i);
			//String rn = (String)resourceLink.get("internalName");
			//if (rn.equalsIgnoreCase(def.getInternalName()))
			String rn = (String)resourceLink.get("name");
			if (rn.equalsIgnoreCase(def.getName()))
			{
				RoleDefinition role = def.getRoleByName( (String)resourceLink.get("role") );
				if (role != null && role.getRoleOrder() < curMax)
					curMax = role.getRoleOrder();
			}
//			rn = (String)resourceLink.get("name");
//			if (rn.equalsIgnoreCase(def.getName()))
//			{
//				RoleDefinition role = def.getRoleByName( (String)resourceLink.get("role") );
//				if (role != null && role.getRoleOrder() < curMax)
//					curMax = role.getRoleOrder();
//			}
		}
		return curMax;
	}

	/** Determines if the user has the provided role within the specified resource (internal name) */
	public boolean hasRole(String resourceLinkName, String role)
	{
		BasicDBList resourceLinkList = getResourceLinkList();
		for (int i = 0; i < resourceLinkList.size(); i++)
		{
			DBObject resourceLink = (DBObject)resourceLinkList.get(i);
			String rn = (String)resourceLink.get("internalName");
			if (rn.equalsIgnoreCase(resourceLinkName))
			{
				if (role.equalsIgnoreCase( (String)resourceLink.get("role") ))
					return true;
			}
		}
		return false;
	}

	/** Determines if the user has the provided role within the specified resource (full name) */
	public boolean hasRoleFullName(String resourceLinkName, String role)
	{
		BasicDBList resourceLinkList = getResourceLinkList();
		for (int i = 0; i < resourceLinkList.size(); i++)
		{
			DBObject resourceLink = (DBObject)resourceLinkList.get(i);
			String rn = (String)resourceLink.get("name");
			if (rn.equalsIgnoreCase(resourceLinkName))
			{
				if (role.equalsIgnoreCase( (String)resourceLink.get("role") ))
					return true;
			}
		}
		return false;
	}

	/**
	 * Removes ALL resource links that match the context
	 * @param context
	 */
	public void removeResourceLinksByContext(String actor, DBObject context)
	{
		BasicDBList resourceLinkList = getResourceLinkList();
		for (int i = 0; i < resourceLinkList.size(); i++)
		{
			DBObject resourceLink = (DBObject)resourceLinkList.get(i);
			if (checkContext(resourceLink, context))
			{
				logger.info("Removing Resource Link: " + resourceLink);

				DBObject event = new BasicDBObject("link", resourceLink);
				addIdentifier(event);
				AuditLog.log("core", actor, "RemoveResourceLink", event);

				resourceLinkList.remove(i);
				i--;
			}
		}		
		setResourceLinkList(resourceLinkList);
	}

	/**
	 * Removes the resource link by internal name and a matching context
	 * @param resourceLinkName
	 * @param context
	 */
	public void removeResourceLinksByName(String actor, String resourceLinkName, DBObject context)
	{
		BasicDBList resourceLinkList = getResourceLinkList();
		for (int i = 0; i < resourceLinkList.size(); i++)
		{
			DBObject resourceLink = (DBObject)resourceLinkList.get(i);
			//logger.info(i + " -> " + resourceLink);
			String rn = (String)resourceLink.get("internalName");
			if (rn.equalsIgnoreCase(resourceLinkName))
			{
				if (checkContext(resourceLink, context))
				{
					logger.info("Removing Resource Link: " + resourceLink);
					
					DBObject event = new BasicDBObject("link", resourceLink);
					addIdentifier(event);
					AuditLog.log("core", actor, "RemoveResourceLink", event);

					resourceLinkList.remove(i);
					i--;
				}
			}
		}
		setResourceLinkList(resourceLinkList);
	}

	/** Returns a list of all ResourceLinks by name and optionally context */
	public List getResourceLinksByFullName(String resourceLinkName, DBObject context)
	{
		List ret = new Vector();
		
		BasicDBList resourceLinkList = getResourceLinkList();
		for (int i = 0; i < resourceLinkList.size(); i++)
		{
			DBObject resourceLink = (DBObject)resourceLinkList.get(i);
			String rn = (String)resourceLink.get("name");
			if (rn.equalsIgnoreCase(resourceLinkName))
			{
				if (checkContext(resourceLink, context))
					ret.add(new ResourceLink(resourceLink));
			}
		}
		
		return ret;
	}
	
	/** Returns a list of all ResourceLinks by (internal) name and optionally context */
	public List getResourceLinksByName(String resourceLinkName, DBObject context)
	{
		List ret = new Vector();
		
		BasicDBList resourceLinkList = getResourceLinkList();
		for (int i = 0; i < resourceLinkList.size(); i++)
		{
			DBObject resourceLink = (DBObject)resourceLinkList.get(i);
			//logger.info(i + " [internalName:" + resourceLinkName + "] -> " + resourceLink);
			String rn = (String)resourceLink.get("internalName");
			if (rn.equalsIgnoreCase(resourceLinkName) || "*".equals(resourceLinkName))
			{
				if (checkContext(resourceLink, context))
					ret.add(new ResourceLink(resourceLink));
			}
		}
		
		return ret;
	}
	
	private boolean checkContext(DBObject resourceLink, DBObject context)
	{
		@SuppressWarnings("unused")
		String errKey = null;
		boolean match = true;
		if (context != null)
		{
			//logger.info(i + " ->\n\n" + resourceLink + "\n\n" + context + "\n\n");
			Iterator it = context.keySet().iterator();
			while (match && it.hasNext())
			{
				String key = it.next();
				String contextVal = (String)context.get(key);
				boolean check = false;
				if (contextVal != null)
				{
					String linkVal = (String)resourceLink.get(key);
					check = !contextVal.equalsIgnoreCase(linkVal);
					//logger.debug(key + " -> '" + contextVal + "' vs '" + linkVal + "' ==> Result: " + check);
				}
				else
					logger.warn("contextValue is null for key [" + key + "] (Context: " + context + ")");
				
				if (check)
				{
					errKey = key;
					match = false;
				}
			}
		}
		return match;
	}
	
	/**
	 * Returns a ResourceLinkDefinition object for the requested resourceLink
	 * 
	 * @param resourceLinkName
	 * @return
	 */
	public ResourceLink getResourceLinkByName(String resourceLinkName)
	{
		BasicDBList resourceLinkList = getResourceLinkList();
		for (int i = 0; i < resourceLinkList.size(); i++)
		{
			DBObject resourceLink = (DBObject)resourceLinkList.get(i);
			String rn = (String)resourceLink.get("internalName");
			if (rn.equalsIgnoreCase(resourceLinkName))
				return new ResourceLink(resourceLink);
		}
		return null;
	}
	
	/**
	 * Updates an existing resourceLink definition
	 * @param newResourceLink
	 */
	public void setResourceLink(ResourceLink newResourceLink)
	{
		boolean found = false;
		BasicDBList resourceLinkList = getResourceLinkList();
		for (int i = 0; i < resourceLinkList.size(); i++)
		{
			DBObject resourceLink = (DBObject)resourceLinkList.get(i);
			String rn = (String)resourceLink.get("internalName");
			if (rn.equalsIgnoreCase(newResourceLink.getName()))
			{
				found = true;
				resourceLinkList.set(i, newResourceLink);
			}
		}
		
		if (!found)
			resourceLinkList.add(newResourceLink);
		
		setResourceLinkList(resourceLinkList);
	}
	
	/**
	 * Save an object, provide username or system component that updated the object
	 * 
	 * @param obj
	 * @param actor
	 */
	public static void save(UntzDBObject obj, String actor)
	{
		if ("true".equalsIgnoreCase(obj.getString("doNotSave")))
			return;
		
		DBCollection coll = MongoDB.getCollection(getDatabaseName(), obj.getCollectionName());
		obj.put("updatedBy", actor);
		obj.put("updated", new Date());
		coll.save(obj);
	}

	public static String getDatabaseName()
	{
		return UOpts.getAppName();
	}

	/**
	 * Returns a list of objects that match the resource link
	 * @param col
	 * @param internalName
	 * @param additionalSearch
	 * @return
	 */
	public static List getByResourceLink(DBCollection col, String internalName, DBObject additionalSearch)
	{
		BasicDBObject lookup = new BasicDBObject("internalName", internalName);
		
		if (additionalSearch != null)
			lookup.putAll(additionalSearch);
		
		BasicDBObject foo = new BasicDBObject();
		foo.put("$elemMatch", lookup);
		
		BasicDBObject query = new BasicDBObject();
		query.put("resourceLinkList", foo);

		logger.info("Resource Link Search: " + query);
		DBCursor cur = col.find(query);
		
		List ret = new Vector();
		while (cur.hasNext())
			ret.add(cur.next());
		
		return ret;
	}
	
	public static List search(SearchTableHeaderInt sth, TablePagerInt pager, DBCollection col, DBObject additionalSearch)
	{
		return search(sth, pager, col, additionalSearch, null);
	}
	
	public static List search(SearchTableHeaderInt sth, TablePagerInt pager, DBCollection col, DBObject additionalSearch, DBObject sorter)
	{
		BasicDBObject lookup = new BasicDBObject();
		
		if (additionalSearch != null)
			lookup.putAll(additionalSearch);

		if (sth != null && sth.getFields() != null)
		{
			Hashtable fields = sth.getFields();
			Enumeration enu = fields.keys();
			while (enu.hasMoreElements())
			{
				String field = enu.nextElement();
				Object value = fields.get(field).getValue();
				if (value instanceof String)
				{
					if (((String)value).length() > 0)
					{
						if ("\"\"".equalsIgnoreCase((String)value))
							lookup.put(field, "");
						else
							lookup.put(field, Pattern.compile(".*" + ((String)value) + ".*", Pattern.CASE_INSENSITIVE));
					}
				}
				else if (value instanceof Date)
				{
					Date d1 = (Date)value;
					if (d1 != null)
					{
						Date d2 = new Date( d1.getTime() + 86400000L );
						lookup.put(field, new BasicDBObject("$gte",d1).append("$lt", d2));
						
						logger.info("Lookup: " + lookup);
					}
				}
			}
		}		
		
		if (sorter == null)
			sorter = new BasicDBObject();
		
		if (sth != null && sth.getSortField() != null)
			sorter.put(sth.getSortField(), sth.getSortDirectionInt());

		logger.debug("Search Query:" + lookup);
		
		DBCursor cur = col.find(lookup).sort(sorter);
		if (pager != null)
		{
			cur.skip(pager.getPage() * pager.getMaxResults());
			cur.limit(pager.getMaxResults());
		}
		
		List ret = new Vector();
		
		while (cur.hasNext())
			ret.add(cur.next());
		
		if (pager != null)
			pager.setResultCount(cur.count());

		return ret;
	}
	
	public static DBObject getPhoneObject(String countryCode, String phoneNumber)
	{
		if (countryCode == null || phoneNumber == null || countryCode.length() == 0 || phoneNumber.length() == 0)
			return null;
		
		DBObject phone = new BasicDBObject();
		phone.put("countryCode", countryCode);
		if ("1".equalsIgnoreCase(countryCode))
		{
			if (phoneNumber.indexOf("-") == -1 && phoneNumber.length() == 10)
			{
				// try to split
				phoneNumber = phoneNumber.substring(0, 3) + "-" + phoneNumber.substring(3, 6) + "-" + phoneNumber.substring(6);
			}
		}
		
		phone.put("phoneNumber", phoneNumber);
		return phone;
	}

	/** Export data from the DBObject list to a file given the provided file format */
	public static int export(String format, List toExport, UFile outputFile, String ... fields) throws Exception
	{
		OutputStream out = outputFile.getOutputStream();
		
		int count = 0;
		int fieldLen = fields.length;

		SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
		
		/*
		 * Output CSV Header
		 */
		StringBuffer buf = new StringBuffer();
		for (int i = 0; i < fieldLen; i++)
		{
			String field = fields[i];
			buf.append("\"").append(field).append("\"");
			if ((i + 1) < fieldLen)
				buf.append(",");
		}
		buf.append("\n");
		out.write(buf.toString().getBytes());
		
		try {
			for (DBObject object : toExport)
			{
				/* Output Each Object based on the format */
				if (TYPE_CSV.equalsIgnoreCase(format))
				{
					buf = new StringBuffer();
					for (int i = 0; i < fieldLen; i++)
					{
						String field = fields[i];
						String[] actionFields = field.split("\\.");
						
						boolean noOutput = false;
						Object res = object.get(actionFields[0]);
						if (res instanceof BasicDBList)
						{
							String myField = actionFields[1];
							String[] limiter = null;
							if (myField.indexOf("[") > -1)
							{
								limiter = myField.substring(myField.indexOf("[") + 1, myField.length() - 1).split("=");
								myField = myField.substring(0, myField.indexOf("["));
							}
							
							noOutput = true;
							boolean hasWritten = false;
							BasicDBList list = (BasicDBList)res;
							for (int q = 0; q < list.size(); q++)
							{
								DBObject o = (DBObject)list.get(q);
								if (limiter != null)
								{
									if (limiter[1].equalsIgnoreCase( (String)o.get(limiter[0]) ))
									{
										if (hasWritten)
											buf.append(",");

										outputValue(o.get(myField), buf, sdf);
										hasWritten = true;
									}
								}
								else 
								{
									outputValue(o.get(myField), buf, sdf);
									if ((q + 1) < list.size())
										buf.append(",");
								}
							}
						}	
						else if (res instanceof DBObject)
						{ 
							// handle certain internal object types
							DBObject dbO = (DBObject)res;
							if ("loc".equalsIgnoreCase(field))
								res = dbO.get("lat") + "," + dbO.get("lng");
							else if (dbO.get("countryCode") != null && dbO.get("phoneNumber") != null)
								res = "+" + dbO.get("countryCode") + " " + dbO.get("phoneNumber");
						}

						if (!noOutput)
							outputValue(res, buf, sdf);

						
						if ((i + 1) < fieldLen)
							buf.append(",");
					}
					buf.append("\n");
					out.write(buf.toString().getBytes("UTF-8"));
				}
				count++;
			}
			out.flush();
		} catch (Exception err) {
			logger.warn("Failed during export", err);
		} finally {
			if (out != null)
				try { out.close(); } catch (Exception e) {}
		}
		
		return count;
	}
	
	private static void outputValue(Object res, StringBuffer buf, SimpleDateFormat sdf)
	{
		if (res == null)
			res = "";
		
		buf.append("\"");
		if (res instanceof Date)
			buf.append(sdf.format( (Date)res ));
		else if (res instanceof String)
		{
			String val = (String)res;
			if ("true".equalsIgnoreCase(val))
				buf.append(1);
			else if ("false".equalsIgnoreCase(val))
				buf.append(0);
			else
				buf.append(res);
		}
		else
			buf.append(res);
			
		buf.append("\"");

		
	}
	
	/**
	 * Returns a list of plugins based on the provided container name
	 * @param containerName
	 * @return
	 */
	public List getPluginsByContainer(String containerName)
	{
		return getPluginsByContainer(containerName, null);
	}

	/**
	 * Returns a list of plugins based on the provided container name - removes potential dupes
	 * @param containerName
	 * @return
	 */
	public List getPluginsByContainerMerged(String containerName)
	{
		return getPluginsByContainerMerged(containerName, null);
	}
	
	/**
	 * Returns a list of plugins based on the provided container name
	 * @param containerName
	 * @return
	 */
	public List getPluginsByContainer(String containerName, String partner)
	{
		List ret = new Vector();
		BasicDBList resourceLinkList = getResourceLinkList();
		for (int i = 0; i < resourceLinkList.size(); i++)
		{
			ResourceLink link = new ResourceLink((DBObject)resourceLinkList.get(i));
			ResourceDefinition def = ResourceDefinition.getByName( link.getName() );
			if (def != null)
			{
				if (!def.partnerMatch(partner))
					continue;
				
				RoleDefinition role = def.getRoleByName(link.getRoleName());
	
				if (role != null)
				{
					List pls = role.getPluginsByContainer(containerName);
					logger.debug("Loading Plugins for [" + get("_id") + "] ==> " + def.getName() + " // " + role.getName() + " // Container: " + containerName + " ===> Count: " + pls.size());
					ret.addAll(pls);
				}
				else
					logger.warn("Uknown Role: " + link.getName() + "/" + link.getRoleName());
			}
			else
				logger.warn("Unknown Resource: " + link.getName());
		}
		return ret;
	}

	/**
	 * Returns a list of plugins based on the provided container name - removes potential dupes
	 * @param containerName
	 * @return
	 */
	public List getPluginsByContainerMerged(String containerName, String partner)
	{
		List ret = new Vector();
		List pluginClassList = getPluginsByContainer(containerName, partner);
		Hashtable track = new Hashtable();

		for (int i = 0; i <  pluginClassList.size(); i++)
		{
			String pluginClass = pluginClassList.get(i);
			if (track.get(pluginClass) == null) // make sure we only load each plugin once
			{
				ret.add(pluginClass);
				track.put(pluginClass, "T");
			}
		}
		
		return ret;
	}
	
	/** Returns the list of Strings that the user 'can manage' */
	public BasicDBList getAPIMappingList()
	{
		BasicDBList ret = (BasicDBList)get("apiMappingList");
		if (ret == null)
			ret = new BasicDBList();
		
		return ret;
	}

	/** Sets the apiMappingList */
	public void setAPIMappingList(BasicDBList list)
	{
		put("apiMappingList", list);
	}
	
	/** Returns the list of devices */
	public BasicDBList getDeviceList()
	{
		BasicDBList ret = (BasicDBList)get("deviceList");
		if (ret == null)
			ret = new BasicDBList();
		
		return ret;
	}

	/** Sets the deviceList */
	public void setDeviceList(BasicDBList list)
	{
		put("deviceList", list);
	}
	
	public void addDeviceID(String deviceType, String deviceId) {
		if (deviceType == null || deviceId == null)
			return;
		
		BasicDBList list = getDeviceList();
		DBObject existing = getDeviceId(list, deviceType, deviceId);
		if (existing != null)
			return;
		
		list.add(new BasicDBObject("deviceType", deviceType).append("deviceId", deviceId));
		setDeviceList(list);
	}
	
	public List getDevices(String deviceType) {

		List ret = new ArrayList();
		
		if (deviceType == null)
			return ret;
		
		BasicDBList list = getDeviceList();
		for (int i = 0; i < list.size(); i++)
		{
			DBObject obj = (DBObject)list.get(i);
			if (deviceType.equalsIgnoreCase( (String)obj.get("deviceType") ))
				ret.add(obj);
		}
		
		return ret;
		
	}
	
	private DBObject getDeviceId(BasicDBList list, String deviceType, String deviceId) {
		
		if (list == null || deviceType == null || deviceId == null)
			return null;
		
		for (int i = 0; i < list.size(); i++)
		{
			DBObject chk = (DBObject)list.get(i);
			if (deviceType.equalsIgnoreCase( (String)chk.get("deviceType") ) && deviceId.equalsIgnoreCase( (String)chk.get("deviceId") ))
				return chk;
		}
		
		return null;
	}
	
	public void removeDeviceId(String deviceType, String deviceId) {
		if (deviceType == null || deviceId == null)
			return;

		BasicDBList list = getDeviceList();
		DBObject existing = getDeviceId(list, deviceType, deviceId);
		if (existing == null)
			return;
		
		list.remove(existing);
		setDeviceList(list);
	}
	
	public void removeAPIMapping(String apiName) {
		
		if (apiName == null)
			return;
		
		BasicDBList list = getAPIMappingList();
		for (int i = 0; i < list.size(); i++)
		{
			DBObject chk = (DBObject)list.get(i);
			if (apiName.equalsIgnoreCase( (String)chk.get("name") ))
			{
				list.remove(i);
				i--;
			}
		}
		setAPIMappingList(list);
	}
	
	public void addAPIMapping(DBObject obj)
	{
		DBObject chk = getAPIMapping( (String)obj.get("name") );
		if (chk != null)
			chk.putAll(obj);
		else
		{
			DBObject event = new BasicDBObject("mapping", obj.get("name"));
			addIdentifier(event);
			AuditLog.log("core", "core", "AddAPIMapping", event);

			BasicDBList list = getAPIMappingList();
			list.add(obj);
			setAPIMappingList(list);
		}
	}

	public APIMapping getAPIMappingGen(String apiName) {
		
		if (apiName == null)
			return null;
		
		APIMapping ret = getAPIMapping(apiName);
		if (ret == null)
		{
			ret = APIMapping.createMapping(apiName);
			ret.setAccessInfo(UUID.randomUUID().toString(), UUID.randomUUID().toString());
			addAPIMapping(ret);
			save(); // save new mapping automatically
		}
		
		return ret;
	}
	
	public APIMapping getAPIMapping(String apiName)
	{
		if (apiName == null)
			return null;
		
		BasicDBList list = getAPIMappingList();
		for (int i = 0; i < list.size(); i++)
		{
			DBObject chk = (DBObject)list.get(i);
			if (apiName.equalsIgnoreCase( (String)chk.get("name") ))
				return new APIMapping(chk);
		}
		
		return null;
	}

	public int getObjectInt(String objName, String field, int def)
	{
		int ret = def;
		
		DBObject obj = (DBObject)get(objName);
		if (obj != null)
		{
			if (obj.get(field) instanceof Double)
			{
				Double i = (Double)obj.get(field);
				if (i != null)
					ret = i.intValue();
			}
			else if (obj.get(field) instanceof Integer)
			{
				Integer i = (Integer)obj.get(field);
				if (i != null)
					ret = i.intValue();
			}
				
		}
		
		return ret;
	}

	public void setObjectInt(String objName, String field, int value)
	{
		DBObject obj = (DBObject)get(objName);
		if (obj == null)
			obj = new BasicDBObject();
		
		obj.put(field, value);
		put(objName, obj);
	}
	
	protected BasicDBList getList(String name)
	{
		BasicDBList ret = (BasicDBList)get(name);
		if (ret == null)
			ret = new BasicDBList();
		
		return ret;
	}
	
	protected void setList(String name, BasicDBList obj)
	{
		put(name, obj);
	}
	
	protected void decache() {
		// stub - implement in your class
	}

	protected void decache(String key)
	{
		if (UOpts.getCacheEnabled())
			UDataCache.getInstance().delete(key);
	}

	protected void cache() {
		// stub - implement in your class
	}

	protected void cache(String key)
	{
		cache(key, 1200);
	}
	
	protected void cache(String key, int ttl)
	{
		if (UOpts.getCacheEnabled())
		{
			logger.debug(String.format("Caching Object [%s] for %d =>\n%s", key, ttl, this));
			UDataCache.getInstance().set(key, ttl, this);
		}
	}

	
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy