package com.yiqiniu.easytrans.context.event; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.yiqiniu.easytrans.context.LogProcessContext; import com.yiqiniu.easytrans.log.vo.Content; import com.yiqiniu.easytrans.log.vo.DemiLeftContent; import com.yiqiniu.easytrans.log.vo.DemiRightContent; import com.yiqiniu.easytrans.log.vo.LogCollection; public class DemiLogEventManager { private Logger LOG = LoggerFactory.getLogger(this.getClass()); private LogProcessContext logCtx; public DemiLogEventManager(LogProcessContext logCtx) { super(); this.logCtx = logCtx; } private Map<Content/*LeftDemi*/,Content/*the matche Right Content*/> mapMatchResult = new HashMap<Content,Content>(); private Map<Content/*LeftDemi*/,List<DemiLogEventHandler>> mapListener = new HashMap<Content/*contentId*/,List<DemiLogEventHandler>>(); public void registerSemiLogEventListener(Content content,DemiLogEventHandler handler){ List<DemiLogEventHandler> list = mapListener.get(content); if(list == null){ list = new ArrayList<DemiLogEventHandler>(); mapListener.put(content, list); } list.add(handler); } public void registerLeftDemiLog(DemiLeftContent content){ mapMatchResult.put(content, null); } public void registerRightDemiLog(DemiRightContent content){ Integer leftDemiConentId = content.getLeftDemiConentId(); Content leftContent = logCtx.getLogCollection().getOrderedContents().get(leftDemiConentId - 1); if(!leftContent.getcId().equals(leftDemiConentId)){ throw new RuntimeException("Content did not sort correctly" + logCtx.getLogCollection().getOrderedContents()) ; } mapMatchResult.put(leftContent, content); } public boolean pubulishDemiLogEvent(){ LogCollection logCollection = logCtx.getLogCollection(); for(Entry<Content, Content> entry:mapMatchResult.entrySet()){ Content leftContent = entry.getKey(); Content rightContent = entry.getValue(); List<DemiLogEventHandler> list = mapListener.get(leftContent); if(rightContent != null){ for(DemiLogEventHandler handler:list){ if(handler != null){ if(!handler.onMatch(logCtx,leftContent,rightContent)){ LOG.info("DemiLogEvent handler return false at onMatch,appId:{},trxId:{}handler:{}",logCollection.getAppId(),logCollection.getTrxId(),handler); return false; } } } }else{ for(DemiLogEventHandler handler:list){ if(handler != null){ if(!handler.onDismatch(logCtx,leftContent)){ LOG.info("DemiLogEvent handler return false at onDismatch,appId:{},trxId:{}handler:{}",logCollection.getAppId(),logCollection.getTrxId(),handler); return false; } } } } } return true; } }