Subversion Repositories SmartDukaan

Rev

Rev 3445 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package in.shop2020.utils;

import in.shop2020.datalogger.EventType;
import in.shop2020.datalogger.SocialEventType;
import in.shop2020.datalogger.event.Event;
import in.shop2020.datalogger.socialevent.SocialEvent;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.Date;
import java.util.ResourceBundle;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.json.JSONObject;

public class DataLogger {
    /**
     * If it fails to log the data to google app engine, we log the event locally to data.log using log4j.
     */
    private static Logger log = Logger.getLogger(DataLogger.class);
    
    /**
     * RootLogger to be used internal logging of this class.
     */
    private static Logger rootLogger = Logger.getRootLogger();
    
    /**
     * Logger to post data to google app engine.
     */
    private static ExecutorService asyncDataLogger = Executors.newSingleThreadExecutor();
    private static ExecutorService asyncSocialDataLogger = Executors.newSingleThreadExecutor();
    private static ResourceBundle properties = ResourceBundle.getBundle(DataLogger.class.getName());
    private static String googleAppUrl = properties.getString("googleappurl");

    public static void logData(final EventType eType, final String sessionId, final long userId, final String email, final String... logData) {
        final String strToWrite = StringUtils.join(logData, ", ");
        final Long time = (new Date()).getTime();
        asyncDataLogger.execute(new Runnable() {
            @Override
            public void run() {
                Event event = Event.createEvent(eType, sessionId, userId, email, logData);
                JSONObject logDataInJson = event.getLogDataInJson();
                try {
                    // Construct data
                    String data = URLEncoder.encode("time", "UTF-8") + "=" + URLEncoder.encode(time.toString(), "UTF-8");
                    data += "&" + URLEncoder.encode("eventType", "UTF-8") + "=" + URLEncoder.encode(eType.name(), "UTF-8");
                    data += "&" + URLEncoder.encode("sessionId", "UTF-8") + "=" + URLEncoder.encode(sessionId, "UTF-8");
                    data += "&" + URLEncoder.encode("userId", "UTF-8") + "=" + URLEncoder.encode(Long.toString(userId), "UTF-8");
                    data += "&" + URLEncoder.encode("email", "UTF-8") + "=" + URLEncoder.encode(email, "UTF-8");
                    if (logDataInJson != null) {
                        data += "&" + URLEncoder.encode("jsonLogData", "UTF-8")
                                + "=" + URLEncoder.encode(logDataInJson.toString(), "UTF-8");
                    }

                    // Send data
                    URL url = new URL("http://" + googleAppUrl + "/add-data-log");
                    URLConnection conn = url.openConnection();
                    conn.setDoOutput(true);
                    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
                    wr.write(data);
                    wr.close();
                    
                    conn.getInputStream().close();
                    
                } catch (UnsupportedEncodingException e) {
                    rootLogger.error("Unsupported Encoding Exception: " + eType.name() + " " + sessionId + " " + userId + " " + email);
                    log.error(eType.name() + ", " + sessionId + ", " + Long.toString(userId) + ", " + email + ", " + strToWrite);
                    
                                } catch (MalformedURLException e) {
                                        rootLogger.error("Malformed URL Exception: " + eType.name() + " " + sessionId + " " + userId + " " + email);
                    log.error(eType.name() + ", " + sessionId + ", " + Long.toString(userId) + ", " + email + ", " + strToWrite);
                    
                                } catch (IOException e) {
                                        rootLogger.error("IO Exception: " + eType.name() + " " + sessionId + " " + userId + " " + email);
                    log.error(eType.name() + ", " + sessionId + ", " + Long.toString(userId) + ", " + email + ", " + strToWrite);
                                }
            }
        });
    }
    
    public static void logSocialData(final SocialEventType eType, final String userId, final String... logData) {
        final String strToWrite = StringUtils.join(logData, ", ");
        final Long time = (new Date()).getTime();
        asyncSocialDataLogger.execute(new Runnable() {
            @Override
            public void run() {
                log.info(eType.name() + ", " + userId + ", " + strToWrite);
                SocialEvent event = SocialEvent.createEvent(eType, userId, logData);
                JSONObject logDataInJson = event.getLogDataInJson();
                
                try {
                    String data = URLEncoder.encode("time", "UTF-8") + "=" + URLEncoder.encode(time.toString(), "UTF-8");
                    data += "&" + URLEncoder.encode("eventType", "UTF-8") + "=" + URLEncoder.encode(eType.name(), "UTF-8");
                    data += "&" + URLEncoder.encode("userId", "UTF-8") + "=" + URLEncoder.encode(userId, "UTF-8");
                    
                    if (logDataInJson != null) {
                        data += "&" + URLEncoder.encode("jsonLogData", "UTF-8") + "=" + URLEncoder.encode(logDataInJson.toString(), "UTF-8");
                    }

                    // Send data
                    URL url = new URL("http://" + googleAppUrl + "/add-social-data-log");
                    URLConnection conn = url.openConnection();
                    conn.setDoOutput(true);
                    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
                    wr.write(data);
                    wr.close();
                    
                    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                    while (in.readLine() != null);
                    in.close();

                } catch (Exception e) {
                    Logger.getRootLogger().warn(e);
                }
            }
        });
    }
    
    public static void main(String[] args) {
        DataLogger.logData(EventType.NEW_SESSION, "FDTWSYTW", 12, "vmalik@gmail.com", "Test");
    }
}