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

prerna.reactor.qs.source.GoogleFileRetrieverReactor Maven / Gradle / Ivy

The newest version!
package prerna.reactor.qs.source;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

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

import prerna.auth.AccessToken;
import prerna.auth.AuthProvider;
import prerna.auth.User;
import prerna.poi.main.helper.CSVFileHelper;
import prerna.poi.main.helper.FileHelperUtil;
import prerna.query.querystruct.CsvQueryStruct;
import prerna.query.querystruct.SelectQueryStruct;
import prerna.reactor.qs.AbstractQueryStructReactor;
import prerna.security.HttpHelperUtility;
import prerna.util.Constants;
import prerna.util.DIHelper;
import prerna.util.Utility;

public class GoogleFileRetrieverReactor extends AbstractQueryStructReactor{

	private static final Logger classLogger = LogManager.getLogger(GoogleFileRetrieverReactor.class);
	private static final String CLASS_NAME = GoogleFileRetrieverReactor.class.getName();

	
	public GoogleFileRetrieverReactor() {
		this.keysToGet = new String[] { "id", "type"};
	}

	@Override
	protected SelectQueryStruct createQueryStruct() {

		//get keys
		Logger logger = getLogger(CLASS_NAME);
		organizeKeys();
		String fileID = this.keyValue.get(this.keysToGet[0]);
		if (fileID == null || fileID.length() <= 0) {
			throw new IllegalArgumentException("Need to specify file id");
		}
		String type= this.keyValue.get(this.keysToGet[1]);
		if (type == null || type.length() <= 0) {
			throw new IllegalArgumentException("Need to specify file type");
		}


		//get access token
		String accessToken=null;
		User user = this.insight.getUser();
		try {
			if(user==null){
				Map retMap = new HashMap();
				retMap.put("type", "google");
				retMap.put("message", "Please login to your Google account");
				throwLoginError(retMap);
			}
			else if (user != null) {
				AccessToken msToken = user.getAccessToken(AuthProvider.GOOGLE);
				accessToken=msToken.getAccess_token();
			}
		}
		catch (Exception e) {
			Map retMap = new HashMap();
			retMap.put("type", "google");
			retMap.put("message", "Please login to your Google account");
			throwLoginError(retMap);
		}

		//Initialize variables
		Hashtable params = new Hashtable();
		CsvQueryStruct qs = new CsvQueryStruct();

		//filepath for the download/export
		String filePath = DIHelper.getInstance().getProperty(Constants.INSIGHT_CACHE_DIR) + "\\"
				+ DIHelper.getInstance().getProperty(Constants.CSV_INSIGHT_CACHE_FOLDER);
		filePath += "\\" + Utility.getRandomString(10) + ".csv";
		filePath = filePath.replace("\\", "/");
		String url_str = null;
		if(type.contains("google-apps.spreadsheet")){
			url_str = "https://www.googleapis.com/drive/v3/files/"+fileID+"/export"; 
			params = new Hashtable();
			params.put("mimeType", "text/csv");
		}
		else if(type.contains("text/csv")){
			url_str = "https://www.googleapis.com/drive/v3/files/"+fileID; 
			params = new Hashtable();
			params.put("alt", "media");
		}
		else{
			throw new IllegalArgumentException("Illegal file type");
		}
		BufferedWriter target = null;
		try{
			BufferedReader br = HttpHelperUtility.getHttpStream(url_str, accessToken, params, true);

			// create a file

			File outputFile = new File(filePath);

			target = new BufferedWriter(new FileWriter(outputFile));
			String data = null;


			while((data = br.readLine()) != null)
			{
				target.write(data);
				target.write("\n");
				target.flush();
			}
			// get datatypes
			CSVFileHelper helper = new CSVFileHelper();
			helper.setDelimiter(',');
			helper.parse(filePath);
			Map[] predictionMaps = FileHelperUtil.generateDataTypeMapsFromPrediction(helper.getHeaders(), helper.predictTypes());
			Map dataTypes = predictionMaps[0];
			Map additionalDataTypes = predictionMaps[1];
			for (String key : dataTypes.keySet()) {
				qs.addSelector("DND", key);
			}
			helper.clear();
			qs.merge(this.qs);
			qs.setFilePath(filePath);
			qs.setDelimiter(',');
			qs.setColumnTypes(dataTypes);
			qs.setAdditionalTypes(additionalDataTypes);
			return qs;
		} catch (IOException e) {
			classLogger.error(Constants.STACKTRACE, e);
		} finally {
			if(target != null) {
		          try {
		        	  target.flush();
		        	  target.close();
		          } catch(IOException e) {
		            logger.error(Constants.STACKTRACE, e);
		          }
		        }
		}

		return qs;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy