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

prerna.reactor.project.AddDefaultInsightsReactor Maven / Gradle / Ivy

The newest version!
package prerna.reactor.project;

import java.time.ZonedDateTime;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.apache.logging.log4j.Logger;

import prerna.auth.utils.AbstractSecurityUtils;
import prerna.auth.utils.SecurityEngineUtils;
import prerna.auth.utils.SecurityInsightUtils;
import prerna.auth.utils.SecurityProjectUtils;
import prerna.engine.api.IDatabaseEngine;
import prerna.engine.impl.rdbms.RDBMSNativeEngine;
import prerna.project.api.IProject;
import prerna.reactor.AbstractReactor;
import prerna.sablecc2.om.GenRowStruct;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.ReactorKeysEnum;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.UploadUtilities;
import prerna.util.Utility;

public class AddDefaultInsightsReactor extends AbstractReactor {

	private static final String CLASS_NAME = AddDefaultInsightsReactor.class.getName();
	
	private static final String INSIGHT_KEYS = "insights";
	
	private static final String EXPLORE_INSTANCE = "explore";
	private static final String GRID_DELTA_INSTANCE = "grid-delta";
	private static final String AUDIT_MODIFICATION = "audit-modification";
	private static final String AUDIT_TIMELINE = "audit-timeline";
	private static final String INSIGHT_STATS = "insight-stats";
	private static final String INSERT_FORM = "insert-form";
	private static final String UPDATE_FORM = "update-form";

	public AddDefaultInsightsReactor() {
		this.keysToGet = new String[]{ReactorKeysEnum.PROJECT.getKey(), ReactorKeysEnum.DATABASE.getKey(), INSIGHT_KEYS};
	}
	
	@Override
	public NounMetadata execute() {
		Logger logger = this.getLogger(CLASS_NAME);
		organizeKeys();
		String projectId = this.keyValue.get(this.keysToGet[0]);
		String databaseId = this.keyValue.get(this.keysToGet[1]);
		List insightsToAdd = getDefaultInsights();
		boolean addAll = false;
		if(insightsToAdd.isEmpty()) {
			addAll = true;
		}
		boolean pullDatabase = true;
		// security and stuff
		if(AbstractSecurityUtils.anonymousUsersEnabled() && this.insight.getUser().isAnonymous()) {
			throwAnonymousUserError();
		}
		
		if(!SecurityProjectUtils.userCanEditProject(this.insight.getUser(), projectId)) {
			throw new IllegalArgumentException("User does not have permission to add insights in the project");
		}
		if(!addAll && insightsToAdd.size()==1 && insightsToAdd.contains(INSIGHT_STATS)) {
			// do not need a database for this situation
			pullDatabase = false;
		} else if(!SecurityEngineUtils.userCanViewEngine(this.insight.getUser(), databaseId)) {
			throw new IllegalArgumentException("User does not have permission to view the database");
		}

		List additionalNouns = new Vector();
		boolean addedInsight = false;
		// already have default methods to add
		
		logger.info("Retrieving database");
		IProject project = Utility.getProject(projectId);
		RDBMSNativeEngine insightEngine = project.getInsightDatabase();
		String projectName = project.getProjectName();
		
		String databaseName = "";
		IDatabaseEngine.DATABASE_TYPE dbType = null;
		if(pullDatabase) {
			IDatabaseEngine database = Utility.getDatabase(databaseId);
			databaseName = database.getEngineName();
			dbType = database.getDatabaseType();
		}
		
		boolean cacheable = Utility.getApplicationCacheInsight();
		int cacheMinutes = Utility.getApplicationCacheInsightMinutes();
		boolean cacheEncrypt = Utility.getApplicationCacheEncrypt();
		String cacheCron = Utility.getApplicationCacheCron();
		ZonedDateTime cachedOn = null;
		
//		ClusterUtil.reactorPullInsightsDB(projectId);
		if(addAll) {
			addedInsight = true;

			logger.info("Adding all default insights");
			Map retMap = UploadUtilities.addExploreInstanceInsight(projectId, projectName, databaseId, databaseName, insightEngine);
			String newInsightId = (String) retMap.get(UploadUtilities.INSIGHT_ID_KEY);
			List recipe = (List) retMap.get(UploadUtilities.RECIPE_ID_KEY);
			String insightName = (String) retMap.get(UploadUtilities.INSIGHT_NAME_KEY);
			String schemaName = (String) retMap.get(UploadUtilities.SCHEMA_NAME_KEY);
			registerInsightAndMetadata(projectId, newInsightId, insightName, UploadUtilities.EXPLORE_INSIGHT_LAYOUT, 
					cacheable, cacheMinutes, cacheCron, cachedOn, cacheEncrypt, recipe, schemaName);
			logger.info("Done adding explore an instance");
			
			retMap = UploadUtilities.addInsightUsageStats(projectId, projectName, insightEngine);
			newInsightId = (String) retMap.get(UploadUtilities.INSIGHT_ID_KEY);
			recipe = (List) retMap.get(UploadUtilities.RECIPE_ID_KEY);
			insightName = (String) retMap.get(UploadUtilities.INSIGHT_NAME_KEY);
			schemaName = (String) retMap.get(UploadUtilities.SCHEMA_NAME_KEY);
			registerInsightAndMetadata(projectId, newInsightId, insightName, UploadUtilities.INSIGHT_USAGE_STATS_LAYOUT, 
					cacheable, cacheMinutes, cacheCron, cachedOn, cacheEncrypt, recipe, schemaName);
			logger.info("Done adding insight usage stats");
			
			if(dbType == IDatabaseEngine.DATABASE_TYPE.RDBMS) {
				retMap = UploadUtilities.addGridDeltaInsight(projectId, projectName, databaseId, databaseName, insightEngine);
				newInsightId = (String) retMap.get(UploadUtilities.INSIGHT_ID_KEY);
				recipe = (List) retMap.get(UploadUtilities.RECIPE_ID_KEY);
				insightName = (String) retMap.get(UploadUtilities.INSIGHT_NAME_KEY);
				schemaName = (String) retMap.get(UploadUtilities.SCHEMA_NAME_KEY);
				registerInsightAndMetadata(projectId, newInsightId, insightName, UploadUtilities.GRID_DELTA_LAYOUT, 
						cacheable, cacheMinutes, cacheCron, cachedOn, cacheEncrypt, recipe, schemaName);
				logger.info("Done adding grid delta");
				
				// add audit insights
				// there could be an issue with loading the recipes to create
				retMap = UploadUtilities.addAuditModificationView(projectId, projectName, databaseId, databaseName, insightEngine);
				if(retMap != null) {
					newInsightId = (String) retMap.get(UploadUtilities.INSIGHT_ID_KEY);
					recipe = (List) retMap.get(UploadUtilities.RECIPE_ID_KEY);
					insightName = (String) retMap.get(UploadUtilities.INSIGHT_NAME_KEY);
					schemaName = (String) retMap.get(UploadUtilities.SCHEMA_NAME_KEY);
					if (newInsightId != null) {
						registerInsightAndMetadata(projectId, newInsightId, insightName, UploadUtilities.AUDIT_MODIFICATION_VIEW_LAYOUT, 
								cacheable, cacheMinutes, cacheCron, cachedOn, cacheEncrypt, recipe, schemaName);
						logger.info("Done adding audit modification view");
					} else {
						additionalNouns.add(NounMetadata.getWarningNounMessage("Unable to add audit modification view"));
					}
				} else {
					additionalNouns.add(NounMetadata.getWarningNounMessage("Unable to add audit timeline view"));
				}
				
				retMap = UploadUtilities.addAuditTimelineView(projectId, projectName, databaseId, databaseName, insightEngine);
				if(retMap != null) {
					newInsightId = (String) retMap.get(UploadUtilities.INSIGHT_ID_KEY);
					recipe = (List) retMap.get(UploadUtilities.RECIPE_ID_KEY);
					insightName = (String) retMap.get(UploadUtilities.INSIGHT_NAME_KEY);
					schemaName = (String) retMap.get(UploadUtilities.SCHEMA_NAME_KEY);
					if (newInsightId != null) {
						registerInsightAndMetadata(projectId, newInsightId, insightName, UploadUtilities.AUDIT_TIMELINE_LAYOUT, 
								cacheable, cacheMinutes, cacheCron, cachedOn, cacheEncrypt, recipe, schemaName);
						logger.info("Done adding audit timeline view");
					} else {
						additionalNouns.add(NounMetadata.getWarningNounMessage("Unable to add audit timeline view"));
					}
				} else {
					additionalNouns.add(NounMetadata.getWarningNounMessage("Unable to add audit timeline view"));
				}
				
			}
		} else {
			if(insightsToAdd.contains(EXPLORE_INSTANCE)) {
				Map retMap = UploadUtilities.addExploreInstanceInsight(projectId, projectName, databaseId, databaseName, insightEngine);
				String newInsightId = (String) retMap.get(UploadUtilities.INSIGHT_ID_KEY);
				List recipe = (List) retMap.get(UploadUtilities.RECIPE_ID_KEY);
				String insightName = (String) retMap.get(UploadUtilities.INSIGHT_NAME_KEY);
				String schemaName = (String) retMap.get(UploadUtilities.SCHEMA_NAME_KEY);
				addedInsight = true;
				registerInsightAndMetadata(projectId, newInsightId, insightName, UploadUtilities.EXPLORE_INSIGHT_LAYOUT, 
						cacheable, cacheMinutes, cacheCron, cachedOn, cacheEncrypt, recipe, schemaName);
				logger.info("Done adding explore an instance");
			}
			if(insightsToAdd.contains(INSIGHT_STATS)) {
				Map retMap = UploadUtilities.addInsightUsageStats(projectId, projectName, insightEngine);
				String newInsightId = (String) retMap.get(UploadUtilities.INSIGHT_ID_KEY);
				List recipe = (List) retMap.get(UploadUtilities.RECIPE_ID_KEY);
				String insightName = (String) retMap.get(UploadUtilities.INSIGHT_NAME_KEY);
				String schemaName = (String) retMap.get(UploadUtilities.SCHEMA_NAME_KEY);
				addedInsight = true;
				registerInsightAndMetadata(projectId, newInsightId, insightName, UploadUtilities.INSIGHT_USAGE_STATS_LAYOUT, 
						cacheable, cacheMinutes, cacheCron, cachedOn, cacheEncrypt, recipe, schemaName);
				logger.info("Done adding insight usage stats");
			}
			if(insightsToAdd.contains(GRID_DELTA_INSTANCE)) {
				if(dbType == IDatabaseEngine.DATABASE_TYPE.RDBMS) {
					Map retMap = UploadUtilities.addGridDeltaInsight(projectId, projectName, databaseId, databaseName, insightEngine);
					String newInsightId = (String) retMap.get(UploadUtilities.INSIGHT_ID_KEY);
					List recipe = (List) retMap.get(UploadUtilities.RECIPE_ID_KEY);
					String insightName = (String) retMap.get(UploadUtilities.INSIGHT_NAME_KEY);
					String schemaName = (String) retMap.get(UploadUtilities.SCHEMA_NAME_KEY);
					addedInsight = true;
					registerInsightAndMetadata(projectId, newInsightId, insightName, UploadUtilities.GRID_DELTA_LAYOUT,
							cacheable, cacheMinutes, cacheCron, cachedOn, cacheEncrypt, recipe, schemaName);
					logger.info("Done adding grid delta");
				} else {
					additionalNouns.add(NounMetadata.getWarningNounMessage("This database is not an RDBMS so grid delta insight cannot be added"));
				}
			}
			if(insightsToAdd.contains(AUDIT_MODIFICATION)) {
				if(dbType == IDatabaseEngine.DATABASE_TYPE.RDBMS) {
					Map retMap = UploadUtilities.addAuditModificationView(projectId, projectName, databaseId, databaseName, insightEngine);
					if(retMap != null) {
						String newInsightId = (String) retMap.get(UploadUtilities.INSIGHT_ID_KEY);
						List recipe = (List) retMap.get(UploadUtilities.RECIPE_ID_KEY);
						String insightName = (String) retMap.get(UploadUtilities.INSIGHT_NAME_KEY);
						String schemaName = (String) retMap.get(UploadUtilities.SCHEMA_NAME_KEY);
						if (newInsightId != null) {
							addedInsight = true;
							registerInsightAndMetadata(projectId, newInsightId, insightName, UploadUtilities.AUDIT_MODIFICATION_VIEW_LAYOUT, 
									cacheable, cacheMinutes, cacheCron, cachedOn, cacheEncrypt, recipe, schemaName);
							logger.info("Done adding audit modification view");
						} else {
							additionalNouns.add(NounMetadata.getWarningNounMessage("Unable to add audit modification view"));
						}
					} else {
						additionalNouns.add(NounMetadata.getWarningNounMessage("Unable to add audit modification view"));
					}
				} else {
					additionalNouns.add(NounMetadata.getWarningNounMessage("This database is not an RDBMS so audit modification view insight cannot be added"));
				}
			}
			if(insightsToAdd.contains(AUDIT_TIMELINE)) {
				if(dbType == IDatabaseEngine.DATABASE_TYPE.RDBMS) {
					Map retMap = UploadUtilities.addAuditTimelineView(projectId, projectName, databaseId, databaseName, insightEngine);
					if(retMap != null) {
						String newInsightId = (String) retMap.get(UploadUtilities.INSIGHT_ID_KEY);
						List recipe = (List) retMap.get(UploadUtilities.RECIPE_ID_KEY);
						String insightName = (String) retMap.get(UploadUtilities.INSIGHT_NAME_KEY);
						String schemaName = (String) retMap.get(UploadUtilities.SCHEMA_NAME_KEY);
						if (newInsightId != null) {
							addedInsight = true;
							registerInsightAndMetadata(projectId, newInsightId, insightName, UploadUtilities.AUDIT_TIMELINE_LAYOUT, 
									cacheable, cacheMinutes, cacheCron, cachedOn, cacheEncrypt, recipe, schemaName);
							logger.info("Done adding audit timeline view");
						} else {
							additionalNouns.add(NounMetadata.getWarningNounMessage("Unable to add audit timeline view"));
						}
					} else {
						additionalNouns.add(NounMetadata.getWarningNounMessage("Unable to add audit modification view"));
					}
				} else {
					additionalNouns.add(NounMetadata.getWarningNounMessage("This database is not an RDBMS so grid delta insight cannot be added"));
				}
			}
			if(insightsToAdd.contains(INSERT_FORM)) {
				if(dbType == IDatabaseEngine.DATABASE_TYPE.RDBMS) {
					Map retMap = UploadUtilities.addInsertFormInsight(projectId, projectName, databaseId, databaseName, insightEngine);
					if(retMap != null) {
						String newInsightId = (String) retMap.get(UploadUtilities.INSIGHT_ID_KEY);
						List recipe = (List) retMap.get(UploadUtilities.RECIPE_ID_KEY);
						String insightName = (String) retMap.get(UploadUtilities.INSIGHT_NAME_KEY);
						String schemaName = (String) retMap.get(UploadUtilities.SCHEMA_NAME_KEY);
						if (newInsightId != null) {
							addedInsight = true;
							registerInsightAndMetadata(projectId, newInsightId, insightName, UploadUtilities.INSERT_FORM_LAYOUT, 
									cacheable, cacheMinutes, cacheCron, cachedOn, cacheEncrypt, recipe, schemaName);
							logger.info("Done adding insert form insight");
						} else {
							additionalNouns.add(NounMetadata.getWarningNounMessage("Unable to add insert form insight"));
						}
					} else {
						additionalNouns.add(NounMetadata.getWarningNounMessage("Unable to add insert form insight"));
					}
				} else {
					additionalNouns.add(NounMetadata.getWarningNounMessage("This database is not an RDBMS so grid delta insight cannot be added"));
				}
			}
		}
		
		// push to the cloud
//		ClusterUtil.reactorPushInsightDB(projectId);
		
		NounMetadata noun = new NounMetadata(true, PixelDataType.BOOLEAN); 
		if(addedInsight) {
			additionalNouns.add(NounMetadata.getSuccessNounMessage("Successfully added default insights"));
		}
		noun.addAllAdditionalReturn(additionalNouns);
		return noun;
	}
	
	private void registerInsightAndMetadata(String projectId, String insightIdToSave, String insightName, String layout, 
			boolean cacheable, int cacheMinutes, String cacheCron, ZonedDateTime cachedOn, boolean cacheEncrypt, 
			List recipe, String schemaName) {
		SecurityInsightUtils.addInsight(projectId, insightIdToSave, insightName, true, layout, 
				cacheable, cacheMinutes, cacheCron, cachedOn, cacheEncrypt, recipe, schemaName);
		if(this.insight.getUser() != null) {
			SecurityInsightUtils.addUserInsightCreator(this.insight.getUser(), projectId, insightIdToSave);
		}
	}
	
	private List getDefaultInsights() {
		GenRowStruct grs = this.store.getNoun(INSIGHT_KEYS);
		if(grs != null && !grs.isEmpty()) {
			return grs.getAllStrValues();
		}
		
		List curStringValues = this.curRow.getAllStrValues();
		// see if databaseId was defined via key or also inline
		if(this.store.getNoun(this.keysToGet[0]) == null || this.store.getNoun(this.keysToGet[0]).isEmpty()) {
			// database id was inline
			// remove index 0
			curStringValues.remove(0);
		}
		
		return curStringValues;
	}
	
	@Override
	protected String getDescriptionForKey(String key) {
		if(key.equals(INSIGHT_KEYS)) {
			return "Determine which default insights to append. "
					+ "Value '" + EXPLORE_INSTANCE + "' = '" + UploadUtilities.EXPLORE_INSIGHT_INSIGHT_NAME + "', "
					+ "Value '" + AUDIT_MODIFICATION + "' = '" + UploadUtilities.AUDIT_MODIFICATION_VIEW_INSIGHT_NAME + "', "
					+ "Value '" + AUDIT_TIMELINE + "' = '" + UploadUtilities.AUDIT_TIMELINE_INSIGHT_NAME + "', "
					+ "value '" + GRID_DELTA_INSTANCE + "' = '" + UploadUtilities.GRID_DELTA_INSIGHT_NAME + "'."
					+ UploadUtilities.GRID_DELTA_INSIGHT_NAME + " only adds if database is type RDBMS."
					+ "No inputs passed will attempt to add all default insight.";
		}
		return super.getDescriptionForKey(key);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy