Subversion Repositories SmartDukaan

Rev

Rev 3193 | Rev 3532 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package in.shop2020.web;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import java.util.logging.Logger;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;

public class AddDataLogServlet extends HttpServlet {
    private static final long serialVersionUID = -8236918415987438049L;
    private static Logger logger = Logger.getLogger(AddDataLogServlet.class.getName());
    
    private static final int BATCH_SIZE = 200;
    private List<Entity> entityList =  new ArrayList<Entity>(); // TO store entities in batches for performance
    
    public void doPost(HttpServletRequest req, HttpServletResponse resp) {
        Entity entity = new Entity("DataLog");
        entity.setProperty("logTime", new Date());
        
        setTime(req, entity);
        setEventType(req, entity);
        setSessionId(req, entity);
        setUserId(req, entity);
        setEmail(req, entity);
        setLogData(req, entity);
        
        entityList.add(entity);
        if(entityList.size() >= BATCH_SIZE) {
            logger.warning("Pushing events to datastore : " + entityList.size());
            synchronized(entityList) {
                DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
                ds.put(entityList);
                entityList.clear();
            }
        }
    }
    
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        doPost(req, resp);
    }

    private void setTime(HttpServletRequest req, Entity entity) {
        Date date = new Date(Long.valueOf(req.getParameter("time")));
        entity.setProperty("date", date);
        
        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("IST"));
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);  
        cal.set(Calendar.SECOND, 0);  
        cal.set(Calendar.MILLISECOND, 0);
        entity.setProperty("shortdate", cal.getTime());
    }
    
    private void setEventType(HttpServletRequest req, Entity entity) {
        entity.setProperty("eventType", req.getParameter("eventType"));
    }

    private void setSessionId(HttpServletRequest req, Entity entity) {
        entity.setProperty("sessionId", req.getParameter("sessionId"));
    }

    private void setUserId(HttpServletRequest req, Entity entity) {
        Integer userId = 0;
        try {
            userId = Integer.valueOf(req.getParameter("userId"));
        }
        catch (NumberFormatException e) {
        }
        entity.setProperty("userId", userId);
    }

    private void setEmail(HttpServletRequest req, Entity entity) {
        entity.setProperty("email", req.getParameter("email"));
    }
    
    private void setLogData(HttpServletRequest req, Entity entity) {
        try {
            String jsonLogData = req.getParameter("jsonLogData");
            if (jsonLogData == null) {
                return;
            }
            JSONObject logDataJson = new JSONObject(req.getParameter("jsonLogData"));
            for (String key : JSONObject.getNames(logDataJson)) {
                if (key.endsWith("_long_list")) {
                    JSONArray vals = logDataJson.getJSONArray(key);
                    List<Long> lVals = new ArrayList<Long>();
                    for (int i = 0; i<vals.length(); i++) {
                        lVals.add(vals.getLong(i));
                    }
                    entity.setProperty(key.replace("_long_list", ""), lVals);
                } else if (key.endsWith("_long")) {
                    entity.setProperty(key.replace("_long", ""), logDataJson.getLong(key));
                }
                else {
                    entity.setProperty(key, logDataJson.getString(key));
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public void destroy() {
        logger.warning("Pushing events to datastore in destroy() : " + entityList.size());
        synchronized(entityList) {
            DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
            ds.put(entityList);
            entityList.clear();
        }
        super.destroy();
    }
}