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

prerna.forms.AbstractFormBuilder Maven / Gradle / Ivy

The newest version!
package prerna.forms;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import prerna.engine.api.IDatabaseEngine;
import prerna.engine.api.IRDBMSEngine;
import prerna.engine.api.IRawSelectWrapper;
import prerna.engine.impl.owl.WriteOWLEngine;
import prerna.rdf.engine.wrappers.WrapperManager;
import prerna.reactor.database.upload.rdbms.RDBMSEngineCreationHelper;
import prerna.util.ConnectionUtils;
import prerna.util.Constants;
import prerna.util.Utility;
import prerna.util.sql.AbstractSqlQueryUtil;

public abstract class AbstractFormBuilder {

	protected static final Logger classLogger = LogManager.getLogger(AbstractFormBuilder.class);

	public static final String FORM_BUILDER_ENGINE_NAME = "form_builder_engine";
	protected static final String AUDIT_FORM_SUFFIX = "_FORM_LOG";
	protected static final String OVERRIDE = "override";
	protected static final String ADD = "Added";
	protected static final String REMOVE = "Removed";
	protected static final String ADMIN_SIGN_OFF = "Certified";

	protected IDatabaseEngine formEng;
	protected String auditLogTableName;
	protected String user;
	protected List tagCols;
	protected List tagValues;
	
	protected IDatabaseEngine engine;
	
	protected final DateFormat DATE_DF = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSSSSS");
	
	protected AbstractFormBuilder(IDatabaseEngine engine) {
		this.formEng = Utility.getDatabase(FORM_BUILDER_ENGINE_NAME);
		this.engine = engine;
		this.auditLogTableName = AbstractSqlQueryUtil.escapeForSQLStatement(RDBMSEngineCreationHelper.cleanTableName(this.engine.getEngineId())).toUpperCase() + FormBuilder.AUDIT_FORM_SUFFIX;
		generateEngineAuditLog(this.auditLogTableName);
	}
	
	public void commitFormData(Map engineHash, String user) throws IOException {
		this.user = user;
		
		if(engineHash.containsKey("tagCols") && engineHash.containsKey("tagValues")) {
			this.tagCols = (List) engineHash.get("tagCols");
			this.tagValues = (List) engineHash.get("tagValues");
		}
		
		String semossBaseURI = "http://semoss.org/ontologies";
		String baseURI = engine.getNodeBaseUri();
		if(baseURI != null && !baseURI.isEmpty()) {
			baseURI = baseURI.replace("/Concept/", "");
		} else {
			baseURI = semossBaseURI;
		}

		String relationBaseURI = semossBaseURI + "/" + Constants.DEFAULT_RELATION_CLASS;
		String conceptBaseURI = semossBaseURI + "/" + Constants.DEFAULT_NODE_CLASS;
		String propertyBaseURI = semossBaseURI + "/" + Constants.DEFAULT_PROPERTY_CLASS;

		List> nodes = new ArrayList>();
		if(engineHash.containsKey("nodes")) {
			nodes = (List>) engineHash.get("nodes"); 
		}
		List> relationships = new ArrayList>();
		if(engineHash.containsKey("relationships")) {
			relationships = (List>)engineHash.get("relationships");
		}
		List> removeNodes = new ArrayList>();
		if(engineHash.containsKey("removeNodes")) {
			removeNodes = (List>) engineHash.get("removeNodes"); 
		}
		List> removeRelationships = new ArrayList>();
		if(engineHash.containsKey("removeRelationships")) {
			removeRelationships = (List>)engineHash.get("removeRelationships");
		}

		saveFormData(baseURI, conceptBaseURI, relationBaseURI, propertyBaseURI, nodes, relationships, removeNodes, removeRelationships);

		//commit information to db
		this.formEng.commit();
		this.engine.commit();
	}
	
	/**
	 * Utility method to generate a form user access table if it doesn't currently exist
	 * @param formEng
	 */
	public static void generateFormPermissionTable(IDatabaseEngine formEng) {
		// create audit table if doesn't exist
		boolean permissionTableExists = false;
		String checkTableQuery = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='FORMS_USER_ACCESS'";
		IRawSelectWrapper wrapper = null;
		try {
			wrapper = WrapperManager.getInstance().getRawWrapper(formEng, checkTableQuery);
			if(wrapper.hasNext()) {
				permissionTableExists = true;
			}
		} catch (Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
		} finally {
			if(wrapper != null) {
				try {
					wrapper.close();
				} catch (IOException e) {
					classLogger.error(Constants.STACKTRACE, e);
				}
			}
		}
		
		if(!permissionTableExists) {
			try(WriteOWLEngine owlEngine = formEng.getOWLEngineFactory().getWriteOWL()) {
				owlEngine.addConcept("FORMS_USER_ACCESS", null, null);
				owlEngine.addProp("FORMS_USER_ACCESS", "USER_ID", "VARCHAR(100)");
				owlEngine.addProp("FORMS_USER_ACCESS", "INSTANCE_NAME", "VARCHAR(255)");
				owlEngine.addProp("FORMS_USER_ACCESS", "IS_SYS_ADMIN", "BOOLEAN");
	
				classLogger.info("CREATING PERMISSION TABLE!!!");
				String query = "CREATE TABLE FORM_USER_ACCESS (USER_ID VARCHAR(100), INSTANCE_NAME VARCHAR(255), IS_SYS_ADMIN BOOLEAN)";
				IRDBMSEngine rdbmsEng = (IRDBMSEngine) formEng;
				classLogger.info("SQL SCRIPT >>> " + query);
				Connection conn = null;
				Statement stmt = null;
				try {
					conn = rdbmsEng.getConnection();
					stmt = conn.createStatement();
					stmt.execute(query);
					if(!stmt.getConnection().getAutoCommit()) {
						stmt.getConnection().commit();
					}
				} catch (Exception e) {
					classLogger.error(Constants.STACKTRACE, e);
				} finally {
					ConnectionUtils.closeAllConnectionsIfPooling(rdbmsEng, conn, stmt, null);
				}
				try {
					owlEngine.commit();
					owlEngine.export();
				} catch (IOException e) {
					classLogger.error(Constants.STACKTRACE, e);
				}
			} catch (IOException | InterruptedException e1) {
				classLogger.error(Constants.STACKTRACE, e1);
			}
		}
	}
	
	protected void generateEngineAuditLog(String auditLogTableName) {
		// create audit table if doesn't exist
		boolean auditTableExists = false;
		String checkTableQuery = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='" + auditLogTableName + "'";
		IRawSelectWrapper wrapper = null;
		try {
			wrapper = WrapperManager.getInstance().getRawWrapper(this.formEng, checkTableQuery);
			if(wrapper.hasNext()) {
				auditTableExists = true;
			}
		} catch (Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
		} finally {
			if(wrapper != null) {
				try {
					wrapper.close();
				} catch (IOException e) {
					classLogger.error(Constants.STACKTRACE, e);
				}
			}
		}
		
		if(!auditTableExists) {
			try(WriteOWLEngine owlEngine = formEng.getOWLEngineFactory().getWriteOWL()) {
				owlEngine.addConcept(auditLogTableName, null, null);
				owlEngine.addProp(auditLogTableName, "ID", "INT");
				owlEngine.addProp(auditLogTableName, "USER", "VARCHAR(255)");
				owlEngine.addProp(auditLogTableName, "ACTION", "VARCHAR(100)");
				owlEngine.addProp(auditLogTableName, "START_NODE", "VARCHAR(255)");
				owlEngine.addProp(auditLogTableName, "REL_NAME", "VARCHAR(255)");
				owlEngine.addProp(auditLogTableName, "END_NODE", "VARCHAR(255)");
				owlEngine.addProp(auditLogTableName, "PROP_NAME", "VARCHAR(255)");
				owlEngine.addProp(auditLogTableName, "PROP_VALUE", "CLOB");
				owlEngine.addProp(auditLogTableName, "TIME", "TIMESTAMP");
	
				classLogger.info("CREATING NEW AUDIT LOG!!!");
				StringBuilder createAuditTable = new StringBuilder("CREATE TABLE ");
				createAuditTable.append(auditLogTableName).append("(ID IDENTITY, USER VARCHAR(255), ACTION VARCHAR(100), START_NODE VARCHAR(255), "
						+ "REL_NAME VARCHAR(255), END_NODE VARCHAR(255), PROP_NAME VARCHAR(255), PROP_VALUE CLOB, TIME TIMESTAMP");
				if(this.tagCols != null) {
					for(String tag : tagCols) {
						createAuditTable.append(tag).append(" VARCHAR(100), ");
						owlEngine.addProp(auditLogTableName, "ID", tag.toUpperCase(), "VARCHAR(100)");
					}
				}
				createAuditTable.append(")");
				String query = createAuditTable.toString();
				classLogger.info("SQL SCRIPT >>> " + Utility.cleanLogString(query));
				try {
					this.formEng.insertData(query);
				} catch (Exception e) {
					classLogger.error(Constants.STACKTRACE, e);
				}
				try {
					owlEngine.commit();
					owlEngine.export();
				} catch (IOException e) {
					classLogger.error(Constants.STACKTRACE, e);
				}
			} catch (IOException | InterruptedException e1) {
				classLogger.error(Constants.STACKTRACE, e1);
			}
			
		} else if(this.tagCols != null && this.tagCols.size() > 0){
			// need to execute and get the columns for the table
			// need to make sure it has the tag cols
			// since there can be multiple forms with different tags for searching on the same engine
			
			try(WriteOWLEngine owlEngine = formEng.getOWLEngineFactory().getWriteOWL()) {

				List cols = new Vector();
				// 1) query to get the current cols
				String allColsPresent = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" + auditLogTableName.toUpperCase() + "'";
				try {
					wrapper = WrapperManager.getInstance().getRawWrapper(this.formEng, allColsPresent);
					while(wrapper.hasNext()) {
						cols.add(wrapper.next().getValues()[0] + "");
					}
				} catch (Exception e) {
					classLogger.error(Constants.STACKTRACE, e);
				} finally {
					if(wrapper != null) {
						try {
							wrapper.close();
						} catch (IOException e) {
							classLogger.error(Constants.STACKTRACE, e);
						}
					}
				}
				// 2) find the cols that we need to add
				List colsToAdd = new Vector();
				List colsToAddTypes = new Vector();
				for(String tag : tagCols) {
					if(!cols.contains(tag)) {
						colsToAdd.add(tag);
						colsToAddTypes.add("VARCHAR(100)");
						owlEngine.addProp(auditLogTableName, tag.toUpperCase(), "VARCHAR(100)");
					}
				}
				
				// 3) perform an update
				if(colsToAdd.size() > 0) {
					IRDBMSEngine rdbmsEng = (IRDBMSEngine) this.formEng;
					Connection conn = null;
					Statement stmt = null;
					String alterQuery = rdbmsEng.getQueryUtil().alterTableAddColumns(auditLogTableName, colsToAdd.toArray(new String[] {}), colsToAddTypes.toArray(new String[] {}));
					classLogger.info("ALTERING TABLE: " + Utility.cleanLogString(alterQuery));
					try {
						conn = rdbmsEng.getConnection();
						stmt = conn.createStatement();
						stmt.execute(alterQuery);
					} catch (Exception e) {
						classLogger.error(Constants.STACKTRACE, e);
					} finally {
						ConnectionUtils.closeAllConnectionsIfPooling(rdbmsEng, conn, stmt, null);
					}
					classLogger.info("DONE ALTER TABLE");
					
					try {
						owlEngine.commit();
						owlEngine.export();
					} catch (IOException e) {
						classLogger.error(Constants.STACKTRACE, e);
					}
				}
			} catch (IOException | InterruptedException e1) {
				classLogger.error(Constants.STACKTRACE, e1);
			}
		}
	}

	/**
	 * Method to actually save form data
	 * @param baseURI
	 * @param conceptBaseURI
	 * @param relationBaseURI
	 * @param propertyBaseURI
	 * @param nodes
	 * @param relationships
	 * @param removeNodes
	 * @param removeRelationships
	 */
	protected abstract void saveFormData(
			String baseURI, 
			String conceptBaseURI,
			String relationBaseURI, 
			String propertyBaseURI,
			List> nodes, 
			List> relationships,
			List> removeNodes, 
			List> removeRelationships);


	/**
	 * Method to replace an instance across the entire db
	 * @param origName
	 * @param newName
	 * @param deleteInstanceBoolean
	 */
	public abstract void modifyInstanceValue(String origName, String newName, boolean deleteInstanceBoolean);
	
	public abstract void certifyInstance(String conceptType, String instanceName);
	
	/**
	 * Store the action that was performed in the audit log
	 * @param action
	 * @param startNode
	 * @param relName
	 * @param endNode
	 * @param propName
	 * @param propValue
	 * @param timeStamp
	 */
	protected void addAuditLog(String action, String startNode, String relName, String endNode, String propName, String propValue, String timeStamp) {
		String cleanUser = null;
		// TODO: FE NEEDS TO PASS IN USER!
		if(this.user != null) {
			cleanUser = this.user;
		} else {
			cleanUser = "User Information Not Submitted";
		}
		IRDBMSEngine rdbmsEng = (IRDBMSEngine) formEng;
		
		PreparedStatement ps = null;

		try {
			ps = rdbmsEng.getPreparedStatement("INSERT INTO "+this.auditLogTableName+" (USER, ACTION, START_NODE, REL_NAME, END_NODE, PROP_NAME, PROP_VALUE, TIME) VALUES(?,?,?,?,?,?,?,?)");
			int parameterIndex = 1;
			ps.setString(parameterIndex++, cleanUser);
			ps.setString(parameterIndex++, action);
			ps.setString(parameterIndex++, startNode);
			ps.setString(parameterIndex++, relName);
			ps.setString(parameterIndex++, endNode);
			ps.setString(parameterIndex++, propName);
			ps.setString(parameterIndex++, propValue);
			ps.setString(parameterIndex++, timeStamp);
			ps.execute();
			if(!ps.getConnection().getAutoCommit()) {
				ps.getConnection().commit();
			}
		} catch (Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
		} finally {
			ConnectionUtils.closeAllConnectionsIfPooling(rdbmsEng, ps);
		}
	}

	public void setUser(String user) {
		this.user = user;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy