GpsRealDataBuffer.java 4.86 KB
package com.bsth.gpsdata.buffer;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.bsth.entity.Cars;
import com.bsth.entity.Station;
import com.bsth.gpsdata.entity.GpsRealData;
import com.bsth.repository.CarsRepository;
import com.bsth.repository.StationRepository;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ListMultimap;

/**
 * 
 * @ClassName: GpsRealDataBuffer 
 * @Description: TODO(GPS 实时数据缓存) 
 * @author PanZhao
 * @date 2016年5月11日 下午4:31:29 
 *
 */
@Component
public class GpsRealDataBuffer {
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	CarsRepository carsRepository;

	@Autowired
	StationRepository stationRepository;
	
	/**
	 * 线路和GPS对照
	 *(K: 线路编码 ,V:GpsRealData)
	 */
	private static ListMultimap<Integer, GpsRealData> lineGpsMultimap;
	
	/**
	 * 设备和GPS对照
	 *(K: 设备编码 ,V:GpsRealData)
	 */
	private static Map<String, GpsRealData> deviceGpsMap;
	
	/**
	 * 设备号和车辆自编号对照
	 * (K: 设备编码 ,V:车辆自编号)
	 */
	private static Map<String, String> vehicDeviceMap;
	
	/**
	 * 站点和编码对照
	 *(K: 站点编码 ,V:站点名称)
	 */
	private static Map<String, String> stationCodeMap;
	
	
	public boolean isNullEmpty(){
		return deviceGpsMap == null;
	}
	
	/**
	 * 
	 * @Title: initBuffer 
	 * @Description: TODO(初始化缓存) 
	 * @throws
	 */
	public void initBuffer(List<GpsRealData> list){
		lineGpsMultimap = ArrayListMultimap.create();
		deviceGpsMap = new HashMap<>();
		
		for(GpsRealData gpsData : list){
			lineGpsMultimap.put(gpsData.getLineId(), gpsData);
			deviceGpsMap.put(gpsData.getDeviceId(), gpsData);
		}
		logger.info("init gps buffer gps! list size: " + list.size());
		initDeviceMapp();
		initStationCodeMap();
	}
	
	public void initDeviceMapp(){
		//初始化车辆设备号对照
		vehicDeviceMap = new HashMap<>();
		Iterator<Cars> carIterator = carsRepository.findAll().iterator();
		
		Cars car;
		while(carIterator.hasNext()){
			car = carIterator.next();
			vehicDeviceMap.put(car.getEquipmentCode(), car.getInsideCode());
		}
		
		logger.info("初始化车辆设备号对照 数量: " + vehicDeviceMap.size());
	}
	
	public void initStationCodeMap(){
		//初始化站点和编码对照
		stationCodeMap = new HashMap<>();
		Iterator<Station> iterator = stationRepository.findAll().iterator();
		
		Station station;
		while(iterator.hasNext()){
			station = iterator.next();
			stationCodeMap.put(station.getStationCod(), station.getStationName());
		}
		
		logger.info("初始化站点编码对照 数量: " + stationCodeMap.size());
	}
	
	public void putLineMultimap(String lineCode, GpsRealData gpsData){
		
	}
	
	public void putDeviceGpsMap(String deviceId, GpsRealData gpsData){
		deviceGpsMap.put(deviceId, gpsData);
	}
	

	/**
	 * 
	 * @Title: updateBuffer 
	 * @Description: TODO(更新缓存) 
	 * @param @param upLines 需要更新映射的线路
	 * @param @param upGpsList 有更新的GPS信号
	 * @throws
	 */
	public void updateBuffer(Set<Integer> upLines, List<GpsRealData> upGpsList){
		
		//更新GPS点
		for(GpsRealData newGps : upGpsList){
			deviceGpsMap.put(newGps.getDeviceId(), newGps);
		}
		
		Iterator<GpsRealData> iterator = deviceGpsMap.values().iterator();
		
		//重新按线路划分
		lineGpsMultimap.clear();
		GpsRealData gpsdata;
		while(iterator.hasNext()){
			gpsdata = iterator.next();
			lineGpsMultimap.put(gpsdata.getLineId(), gpsdata);
		}
		logger.info("update gps buffer over! new gps list size: " + upGpsList.size() + "  - lineGpsMultimap size: " + lineGpsMultimap.size());
	}
	
	/**
	 * 
	 * @Title: getDeviceGpsMap 
	 * @Description: TODO(获取设备号 ——> 实时GPS对照) 
	 * @return ImmutableMap<String,GpsRealData> 不可变的对照表 
	 * @throws
	 */
	public ImmutableMap<String, GpsRealData> getDeviceGpsMap(){
		return ImmutableMap.copyOf(deviceGpsMap);
	}
	
	/**
	 * 
	 * @Title: getListByLineCode 
	 * @Description: TODO(根据线路编码获取该线路所有的GPS点) 
	 * @return List<GpsRealData>    返回类型 
	 * @throws
	 */
	public List<GpsRealData> getListByLineCode(Integer lineCode){
		List<GpsRealData> list = lineGpsMultimap.get(lineCode);
		
		//写入车辆自编号
		for(GpsRealData gpsData : list){
			gpsData.setNbbm(vehicDeviceMap.get(gpsData.getDeviceId()));
			gpsData.setStationName(stationCodeMap.get(gpsData.getStopNo()));
		}
		return list;
	}
}