/** * Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved. * EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * http://www.ewcms.com */ package com.ewcms.plugin.visit.manager.service; import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ewcms.common.lang.EmptyUtil; import com.ewcms.core.site.dao.ChannelDAO; import com.ewcms.core.site.model.Channel; import com.ewcms.plugin.visit.manager.dao.VisitDAO; import com.ewcms.plugin.visit.manager.dao.VisitItemDAO; import com.ewcms.plugin.visit.model.Visit; import com.ewcms.plugin.visit.model.VisitItem; import com.ewcms.plugin.visit.util.VisitUtil; /** * * @author wu_zhijun * */ @Service public class VisitService implements VisitServiceable { @Autowired private VisitDAO visitDAO; @Autowired private VisitItemDAO visitItemDAO; @Autowired private ChannelDAO channelDAO; @Override public void addVisitByLoadEvent(Visit visit, VisitItem visitItem) { Visit dbVisit = findVisitEntity(visit); if (dbVisit == null) { visitDAO.persist(visit); visitItem.setUniqueId(visit.getUniqueId()); visitItem.setPageView(1L); visitItem.setDepth(findVisitDepth(1L, visitItem.getChannelId())); visitItemDAO.persist(visitItem); } else { VisitItem dbVisitItem = visitItemDAO.findVisitItemByVisitItemPK(dbVisit.getUniqueId(), visitItem.getSiteId(), visitItem.getChannelId(), visitItem.getArticleId(), visitItem.getUrl()); if (dbVisitItem == null){ visitItem.setUniqueId(dbVisit.getUniqueId()); visitItem.setPageView(1L); visitItem.setDepth(findVisitDepth(1L, visitItem.getChannelId())); visitItemDAO.persist(visitItem); }else{ dbVisitItem.setPageView(dbVisitItem.getPageView() + 1); visitItemDAO.merge(dbVisitItem); } dbVisit.setRvFlag(visit.getRvFlag()); visitDAO.merge(dbVisit); } } @Override public void addVisitByKeepAliveEvent(Visit visit, VisitItem visitItem) { Visit dbVisit = findVisitEntity(visit); if (dbVisit != null){ VisitItem dbVisitItem = visitItemDAO.findVisitItemByVisitItemPK(dbVisit.getUniqueId(), visitItem.getSiteId(), visitItem.getChannelId(), visitItem.getArticleId(), visitItem.getUrl()); if (dbVisitItem != null){ dbVisitItem.setStickTime(visitItem.getStickTime() + dbVisitItem.getStickTime()); visitItem.setDepth(findVisitDepth(1L, visitItem.getChannelId())); visitItemDAO.merge(dbVisitItem); } } } @Override public void addVisitByUnloadEvent(Visit visit, VisitItem visitItem){ VisitItem dbVisitItem = visitItemDAO.findVisitItemByVisitItemPK(visit.getUniqueId(), visitItem.getSiteId(), visitItem.getChannelId(), visitItem.getArticleId(), visitItem.getUrl()); if (dbVisitItem != null){ dbVisitItem.setEvent(VisitUtil.UNLOAD_EVENT); visitItem.setDepth(findVisitDepth(1L, visitItem.getChannelId())); visitItemDAO.merge(dbVisitItem); } } private Visit findVisitEntity(Visit visit) { String uniqueId = visit.getUniqueId(); Date addDate = visit.getAddDate(); String ip = visit.getIp(); if (EmptyUtil.isStringNotEmpty(uniqueId) && EmptyUtil.isNotNull(addDate) && EmptyUtil.isNotNull(ip)) return visitDAO.findVisitByVisitPK(uniqueId, addDate, ip); else return null; } private Long findVisitDepth(Long depth, Integer channelId){ if (channelId == null) return depth; Channel channel = channelDAO.get(channelId); if (channel == null) return depth; Channel parent = channel.getParent(); if (parent == null) return depth; depth = depth + 1; return findVisitDepth(depth, parent.getId()); } }