package com.springone.myrestaurants.web; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.document.analytics.MvcEvent; import org.springframework.data.document.analytics.Parameters; import org.springframework.data.document.mongodb.MongoTemplate; import org.springframework.data.document.web.servlet.ActionExecutedContext; import org.springframework.data.document.web.servlet.ActionExecutingContext; import org.springframework.data.document.web.servlet.ActionInterceptor; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import com.mongodb.BasicDBObject; import com.mongodb.WriteResult; @Component public class DatastoreInterceptor implements ActionInterceptor { @Autowired private MongoTemplate mongoTemplate; @Override public boolean preHandle(ActionExecutingContext actionExecutingContext) { System.out.println(actionExecutingContext); return true; } @Override public void postHandle(ActionExecutedContext actionExecutedContext) { System.out.println(actionExecutedContext); } @Override public void afterCompletion(ActionExecutedContext actionExecutedContext) { printDebug(actionExecutedContext); MvcEvent event = createMvcEvent(actionExecutedContext); mongoTemplate.save(event); storeCounterData(actionExecutedContext.getHandler().getClass().getSimpleName(), actionExecutedContext.getHandlerMethod().getName()); } public void storeCounterData(String controllerName, String methodName) { BasicDBObject query = new BasicDBObject("name", controllerName); BasicDBObject changes = new BasicDBObject(); changes.put("$set", new BasicDBObject("name", controllerName)); changes.put("$inc", new BasicDBObject("count", 1)); WriteResult r = mongoTemplate.getCollection("counters").update(query, changes, true,false); System.out.println(r); changes = new BasicDBObject("$inc", new BasicDBObject("methods." + methodName, 1)); r = mongoTemplate.getCollection("counters").update(query, changes, true, false); System.out.println(r); } private void printDebug(ActionExecutedContext actionExecutedContext) { //System.out.println(actionExecutedContext); HttpServletRequest request = actionExecutedContext.getHttpServletRequest(); System.out.println("Handler Class = " + actionExecutedContext.getHandler().getClass()); System.out.println("Request URI = " + actionExecutedContext.getHttpServletRequest().getRequestURI()); System.out.println("Remote Address = " + actionExecutedContext.getHttpServletRequest().getRemoteAddr()); HttpSession session = actionExecutedContext.getHttpServletRequest().getSession(false); if (session != null ) { System.out.println("Session ID = " + session.getId()); } String remoteUser = request.getRemoteUser(); if (StringUtils.hasLength(remoteUser)) { System.out.println("Remote User = " + remoteUser); } } private MvcEvent createMvcEvent( ActionExecutedContext actionExecutedContext) { MvcEvent event = new MvcEvent(); event.setAction(actionExecutedContext.getHandlerMethod().getName()); event.setController(actionExecutedContext.getHandler().getClass().getSimpleName()); event.setDate(new Date()); Parameters parameters = new Parameters(); Object[] args = actionExecutedContext.getHandlerParameters(); for (int i = 0; i < args.length; i++) { if (i==0) { if (args[i] != null) parameters.setP1(args[i].toString()); } if (i==1) { if (args[i] != null) parameters.setP2(args[i].toString()); } if (i==2) { if (args[i] != null) parameters.setP3(args[i].toString()); } } event.setParameters(parameters); event.setRemoteUser(actionExecutedContext.getHttpServletRequest().getRemoteUser()); event.setRequestAddress(actionExecutedContext.getHttpServletRequest().getRemoteAddr()); event.setRequestUri(actionExecutedContext.getHttpServletRequest().getRequestURI()); return event; } }