kikiv 发表于 2015-07-15 09:48

同步比较器工具

项目中,我们常常遇到需要同步数据的情况,这个时候我们需要将 旧数据 与 新数据 做对比。处理三种情况的数据:①存在于旧数据,不存在于新数据的信息,进行移除操作;②存在于旧数据,也存在于新数据的信息,进行更新操作;③不存在于旧数据,存在于新数据的信息,进行添加操作。

同步比较器基类/**
* 基本 同步比较器
* @author linling
*
*/
public class BasicComparator {
   
    public interfaceListCompareHandler<T> {
         
      public void handlerNewEntry(T t);
         
      public void handlerNoMoreEntry(T t);
         
      public void handlerSameEntry(T t);
         
      /**
         * if oneList contain otherList return boolean , Otherwise return false;
         * @param oneList
         * @param otherList
         * @return
         */
      public boolean contain(List<T> oneList, T t) throws Exception;
    }
   
    public <T> void compareTo(List<T> oldList, List<T> newList, ListCompareHandler<T> handler)throws Exception{
      for(Iterator<T> iter = oldList.iterator(); iter.hasNext();) {
            T t = iter.next();
            if(!handler.contain(newList, t)) {
                handler.handlerNoMoreEntry(t);
            }
      }
         
      for(Iterator<T> iter = newList.iterator(); iter.hasNext();) {
            T t = iter.next();
            if(handler.contain(oldList, t)) {
                handler.handlerSameEntry(t);
            }else {
                handler.handlerNewEntry(t);
            }
      }
    }
   
    public interface SetCompareHandler<T> {
      public void handlerNewEntry(T t);
         
      public void handlerNoMoreEntry(T t);
         
      public void handlerSameEntry(T t);
         
      /**
         * if oneSet contain otherSet return true, Otherwise return false;
         * @param oneSet
         * @param otherSet
         * @return
         */
      public boolean contain(Set<T> oneSet, T t) throws Exception;
    }
   
    public <T> void compareTo(Set<T> oldSet, Set<T> newSet, SetCompareHandler<T> handler) throws Exception{
      for(Iterator<T> iter = oldSet.iterator(); iter.hasNext();) {
            T t = iter.next();
            if(!handler.contain(newSet, t)) {
                handler.handlerNoMoreEntry(t);
            }
      }

      for(Iterator<T> iter = newSet.iterator();iter.hasNext();) {
            T t = iter.next();
            if(handler.contain(oldSet, t)) {
                handler.handlerSameEntry(t);
            }else {
                handler.handlerNewEntry(t);
            }
      }
    }
   
    public interface MapCompareHandler<K,V> {
      public void handlerNewEntry(Map.Entry<K, V> entry);
         
      public void handlerNoMoreEntry(Map.Entry<K, V> entry);
         
      public void handlerSameEntry(Map.Entry<K, V> entry);
         
      /**
         * if oneMap contain otherMap return true, Otherwise return false;
         * @param oneMap
         * @param otherMap
         * @return
         */
      public boolean contain(Map<K,V> oneMap, Map.Entry<K, V> entry) throws Exception;
    }
   
    public <K,V> void compareTo(Map<K,V> newMap, Map<K,V> oldMap, MapCompareHandler<K,V> handler) throws Exception{
      Set<Map.Entry<K, V>> oldEntrySet = oldMap.entrySet();
      for(Iterator<Map.Entry<K, V>> iter = oldEntrySet.iterator(); iter.hasNext();) {
            Map.Entry<K, V> entry = iter.next();
            if(!handler.contain(newMap, entry)) {
                handler.handlerNoMoreEntry(entry);
            }
      }
         
      Set<Map.Entry<K, V>> newEntrySet = newMap.entrySet();
      for(Iterator<Map.Entry<K, V>> iter = newEntrySet.iterator(); iter.hasNext();) {
            Map.Entry<K, V> entry = iter.next();
            if(handler.contain(oldMap, entry)) {
                handler.handlerSameEntry(entry);
            }else {
                handler.handlerNewEntry(entry);
            }
      }
    }
}



下面是实现了上面 基本比较器的基本类,负责初始化List和Set比较器的handler操作。我在项目中只需要集成下面这个类就好。

package com.bayern;

import java.util.List;
import java.util.Set;


/**
* 基本 全同步比较器基础类
* @author linling
*
* @param <VO>
*/
public abstract class ComparatorAdapter<VO> extends BasicComparator {

    @SuppressWarnings("rawtypes")
    protected BasicService basicService;
   
    public abstract void setBasicService(BasicService<VO> basicService);
   
   
    public class ListCompareHandlerAdapter implements ListCompareHandler<VO> {
      public void handlerNewEntry(VO vo) {
            basicService.save(vo);
      }
         
      public void handlerNoMoreEntry(VO vo) {
            basicService.delete(vo);
      }
         
      public void handlerSameEntry(VO vo) {
            basicService.update(vo);
      }

      /**
         * 该方法必须被子类覆盖重写
         */
      @Override
      public boolean contain(List<VO> oneList, VO t) throws Exception{
            throw new Exception();
      }
    }
   
    public class SetCompareHandlerAdapter implements SetCompareHandler<VO> {
      public void handlerNewEntry(VO vo) {
            basicService.save(vo);
      }
         
      public void handlerNoMoreEntry(VO vo) {
            basicService.delete(vo);
      }
         
      public void handlerSameEntry(VO vo) {
            basicService.update(vo);
      }

      /**
         * 该方法必须被子类覆盖重写
         */
      @Override
      public boolean contain(Set<VO> oneSet, VO t)throws Exception{
            throw new Exception();
      }

    }
}



最后,来个实际的比较器:
package com.bayern;

import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

/**
* 摄像头比较器
* @author linling
*
*/
@Component(value="cameraComparator")
public class CameraComparator extends ComparatorAdapter<VoCamera>{

   
    public CameraComparator(){
    }
   
    @Resource(name="cameraServiceImpl")
    @Override
    public void setBasicService(BasicService<VoCamera> basicService) {
      super.basicService = basicService;
    }

    public class CameraComparatorHandler extends ListCompareHandlerAdapter{
      private long schoolId;
      public CameraComparatorHandler(long schoolId) {
            this.schoolId = schoolId;
      }
      @Override
      public boolean contain(List<VoCamera> oneList, VoCamera t)throws Exception{
            boolean exists = false;
            for(Iterator<VoCamera> iter = oneList.iterator(); iter.hasNext();) {
                VoCamera vo = iter.next();
                if(t.getCameraSignature().equals(vo.getCameraSignature()) && schoolId == vo.getSchoolId().longValue()) {
                  if(!CommonUtils.stringIsBlank(vo.getCameraId()) && CommonUtils.stringIsBlank(t.getCameraId())) {
                        t.setCameraId(vo.getCameraId());
                  }
                  exists = true;
                  break;
                }
            }
            return exists;
      }
         
      @Override
      public void handlerNewEntry(VoCamera vo) {
            vo.setCameraId(UUID.randomUUID().toString());
            super.handlerNewEntry(vo);
      }
         
    }
   
}
页: [1]
查看完整版本: 同步比较器工具