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

prerna.reactor.utils.ImageCaptureReactor Maven / Gradle / Ivy

The newest version!
package prerna.reactor.utils;

import java.io.IOException;
import java.util.List;

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

import prerna.cluster.util.ClusterUtil;
import prerna.engine.api.IDatabaseEngine;
import prerna.engine.api.IRawSelectWrapper;
import prerna.om.Insight;
import prerna.om.OldInsight;
import prerna.om.ThreadStore;
import prerna.project.api.IProject;
import prerna.rdf.engine.wrappers.WrapperManager;
import prerna.reactor.AbstractReactor;
import prerna.sablecc2.PixelUtility;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.ReactorKeysEnum;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.AssetUtility;
import prerna.util.Constants;
import prerna.util.Utility;

public class ImageCaptureReactor extends AbstractReactor {

	private static final Logger classLogger = LogManager.getLogger(ImageCaptureReactor.class);

	private static final String CLASS_NAME = ImageCaptureReactor.class.getName();
	// get the directory separator
	protected static final String DIR_SEPARATOR = java.nio.file.FileSystems.getDefault().getSeparator();

	public ImageCaptureReactor() {
		this.keysToGet = new String[] { ReactorKeysEnum.PROJECT.getKey(), ReactorKeysEnum.URL.getKey(), 
				ReactorKeysEnum.PARAM_KEY.getKey(), ReactorKeysEnum.IMAGE_WAIT_TIME.getKey() };
	}

	@Override
	public NounMetadata execute() {
		Logger logger = getLogger(CLASS_NAME);
		logger.info("Starting image capture...");
		logger.info("Operation can take up to 10 seconds to complete");
		
		organizeKeys();
		String projectId = this.keyValue.get(this.keysToGet[0]);
		String feUrl = this.keyValue.get(this.keysToGet[1]);
		String param = this.keyValue.get(this.keysToGet[2]);
		String sessionId = ThreadStore.getSessionId();
		
		Integer waitTime = null;
		String waitTimeStr = this.keyValue.get(this.keysToGet[3]);
		if(waitTimeStr != null && (waitTimeStr=waitTimeStr.trim()).isEmpty()) {
			try {
				waitTime = Integer.parseInt(waitTimeStr);
			} catch(NumberFormatException e) {
				throw new IllegalArgumentException("Invalid wait time option = '" + waitTimeStr + "'. Error is: " + e.getMessage());
			}
		}
		
		IProject coreProject = Utility.getProject(projectId);
		// loop through the insights
		IDatabaseEngine insightsEng = coreProject.getInsightDatabase();
		IRawSelectWrapper wrapper = null;
		try {
			wrapper = WrapperManager.getInstance().getRawWrapper(insightsEng, "select distinct id from question_id");
			while(wrapper.hasNext()) {
				String id = wrapper.next().getValues()[0] + "";
				runImageCapture(feUrl, projectId, id, param, sessionId, waitTime);
			}
		} catch (Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
		} finally {
			if(wrapper!=null) {
				try {
					wrapper.close();
				} catch (IOException e) {
					classLogger.error(Constants.STACKTRACE, e);
				}
			}
		}

		ClusterUtil.pushProject(projectId);
		return new NounMetadata(true, PixelDataType.BOOLEAN);
	}

	public static void runImageCapture(String feUrl, String projectId, String insightId, String params, String sessionId, Integer waitTime) {
		IProject coreProject = Utility.getProject(projectId);
		if(coreProject == null) {
			throw new IllegalArgumentException("Cannot find project = " + projectId);
		}
		runImageCapture(feUrl, coreProject, projectId, insightId, params, sessionId, waitTime);
	}
	
	public static void runImageCapture(String feUrl, IProject coreProject, String appId, String insightId, String params, String sessionId, Integer waitTime) {
		Insight insight = null;
		try {
			insight = coreProject.getInsight(insightId).get(0);
		} catch(Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
		}
		if(insight instanceof OldInsight) {
			return;
		}
		List recipe = insight.getPixelList().getPixelRecipe();
		if(params != null || !PixelUtility.isNotCacheable(recipe)) {
			runHeadlessChrome(feUrl, insight, params, sessionId, waitTime);
		}
		
//		if(params != null || !PixelUtility.hasParam(recipe)) {
//			String[] cmd = getCmdArray(feUrl, insight, params);
//			Process p = null;
//			try {
//				p = new ProcessBuilder(cmd).start();
//				while(p.isAlive()) {
//					try {
//						p.waitFor();
//					} catch (InterruptedException e) {
//						classLogger.error(Constants.STACKTRACE, e);
//					}
//				}
//			} catch (IOException e) {
//				classLogger.error(Constants.STACKTRACE, e);
//			} finally {
//				// destroy it
//				if(p != null) {
//					p.destroy();
//				} else {
//					System.out.println("ERROR RUNNING IMAGE CAPTURE!!!");
//					System.out.println("ERROR RUNNING IMAGE CAPTURE!!!");
//					System.out.println("ERROR RUNNING IMAGE CAPTURE!!!");
//					System.out.println("ERROR RUNNING IMAGE CAPTURE!!!");
//					System.out.println("ERROR RUNNING IMAGE CAPTURE!!!");
//				}
//			}
//		}
	}

	/**
	 * Run headless chrome via selenium
	 * @param feUrl
	 * @param insight
	 * @param params
	 * @param sessionId
	 */
	private static void runHeadlessChrome(String feUrl, Insight insight, String params, String sessionId, Integer waitTime) {
		feUrl = feUrl.trim();
		String id = insight.getRdbmsId();
		String projectId = insight.getProjectId();
		String projectName = insight.getProjectName();
//		String baseFolder = DIHelper.getInstance().getProperty(Constants.BASE_FOLDER);
		String imageDirStr = "";
		if(params == null) {
//			imageDirStr = baseFolder + 
//				DIR_SEPARATOR + "db" + 
//				DIR_SEPARATOR + SmssUtilities.getUniqueName(engineName, engineId) + 
//				DIR_SEPARATOR + "version" +
//				DIR_SEPARATOR + id;
			imageDirStr = AssetUtility.getProjectVersionFolder(projectName, projectId) + DIR_SEPARATOR + id;
		} else {
			// params is already encodeed
			imageDirStr = AssetUtility.getProjectVersionFolder(projectName, projectId) +
					DIR_SEPARATOR + id + 
					DIR_SEPARATOR + "params" + 
					DIR_SEPARATOR + params;
		}
		
		String url = null;
		if(params != null) {
			url = feUrl+ "#!/insight?type=multi&engine=" + projectId + "&id=" + id + "¶meters=" + params +  "&hideMenu=true&drop=5000&animation=false";
		} else {
			url = feUrl+ "#!/insight?type=multi&engine=" + projectId + "&id=" + id + "&hideMenu=true&drop=5000&animation=false";
		}
		insight.getChromeDriver().captureImage(feUrl, url, imageDirStr + DIR_SEPARATOR + "image.png", sessionId, waitTime);
	}
	

	
//	private static String[] getCmdArray(String feUrl, Insight in, String params) {
//		String id = in.getRdbmsId();
//		String engineId = in.getEngineId();
//		String engineName = in.getEngineName();
//		
//		String imageDirStr = DIHelper.getInstance().getProperty(Constants.BASE_FOLDER) + 
//				DIR_SEPARATOR + "db" + 
//				DIR_SEPARATOR + SmssUtilities.getUniqueName(engineName, engineId) + 
//				DIR_SEPARATOR + "version" +
//				DIR_SEPARATOR + id;
//		
//		if(params != null) {
//			imageDirStr += params;
//		}
//		
//		File imageDir = new File(imageDirStr);
//		if(!imageDir.exists()) {
//			imageDir.mkdirs();
//		}
//
//		String googleHome = DIHelper.getInstance().getProperty(Constants.GOOGLE_CHROME_HOME);
//		if(googleHome == null) {
//			googleHome = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe";
//		}
//		
//		String insecure = "";
//		if(feUrl.contains("localhost") && feUrl.contains("https")) {
//			insecure = "--allow-insecure-localhost ";
//		}
//		String[] cmd = null;
//		if(insecure.equals("")){
//			if(params != null) {
//				cmd = new String[]{googleHome,"--headless","--disable-gpu","--window-size=1440,1440","--virtual-time-budget=10000",
//						"--screenshot="+imageDirStr + DIR_SEPARATOR + "image.png",feUrl+ "#!/insight?type=single&engine=" + engineId + "&id=" + id + "¶meters=" + params +  "&hideMenu=true&panel=0&drop=1000"};	
//
//			} else {
//				cmd = new String[]{googleHome,"--headless","--disable-gpu","--window-size=1440,1440","--virtual-time-budget=10000",
//						"--screenshot="+imageDirStr + DIR_SEPARATOR + "image.png",feUrl+ "#!/insight?type=single&engine=" + engineId + "&id=" + id + "&hideMenu=true&panel=0&drop=1000"};	
//			}
//		}
//		else {
//			if(params != null) {
//				cmd = new String[]{googleHome,"--headless","--disable-gpu","--window-size=1440,1440","--virtual-time-budget=10000",insecure,
//						"--screenshot="+imageDirStr + DIR_SEPARATOR + "image.png",feUrl+ "#!/insight?type=single&engine=" + engineId + "&id=" + id + "¶meters=" + params + "&hideMenu=true&panel=0&drop=1000"};				
//			} else {
//				cmd = new String[]{googleHome,"--headless","--disable-gpu","--window-size=1440,1440","--virtual-time-budget=10000",insecure,
//						"--screenshot="+imageDirStr + DIR_SEPARATOR + "image.png",feUrl+ "#!/insight?type=single&engine=" + engineId + "&id=" + id + "&hideMenu=true&panel=0&drop=1000"};	
//			}
//		}
//		return cmd;
//	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy