DataContext.java 4.37 KB
/**@author Sherlock_yb
 * Created time:2014-2-26
 */
package nlp.whu.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import nlp.whu.model.CRegion;
import nlp.whu.model.Region;
import nlp.whu.utils.DB.C3P0Util;

public class DataContext{
	private static Logger log = Log4jUtil.getInstance().getLogger(DataContext.class);
	private static List<CRegion> regions = new ArrayList<CRegion>();;
	/**
	 * 所有的地区的map,主要是为了方便查找
	 */
	private static Map<Integer, CRegion> regionMap = new HashMap<Integer, CRegion>();;
	private static boolean regionLoad = false;
	private static synchronized void loadRegions(){
		if(!regionLoad){
			getRootRegions(regions, regionMap);
			regionLoad = true;
		}
	}
	public static CRegion getRegion(int regionId){
		if(!regionLoad){
			loadRegions();
		}
		//如果regionId不存在,则返回null
		return regionMap.get(regionId);
	}
	public static List<CRegion> getRegions(){
		if(!regionLoad){
			loadRegions();
		}
		return regions;
	}
	//获取顶级地域(没有父级地域)
	public static List<CRegion> getRootRegions(List<CRegion> regions, Map<Integer, CRegion> crMap) {
		List<Region> rgs = new ArrayList<Region>();
		String sql = "select * from wdyq_region order by ordinal";
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			conn = C3P0Util.getConn(C3P0Util.DATA_SOURCE_APP);
			stmt = conn.prepareStatement(sql);
			rs = stmt.executeQuery();
			while(rs.next()){
				Region r = new Region();
				CRegion cr = new CRegion();
				//c的字段,从数据库中取int型时,要注意为null的情况,此时getInt会自动返回0
				if(rs.getString("regionID") == null){
	    			r.setRegionID(null);
	    		}else{
	    			r.setRegionID(rs.getInt("regionID"));
	    		}
				if(rs.getString("provinceID") == null){
					r.setProvinceID(null);
				}else{
					r.setProvinceID(rs.getInt("provinceID"));
				}
				r.setRegionName(rs.getString("regionName"));
				if(rs.getString("regionLevel") == null){
					r.setRegionLevel(null);
				}else{
					r.setRegionLevel(rs.getInt("regionLevel"));
				}
				if(rs.getString("parentID") == null){
					r.setParentID(null);
				}else{
					r.setParentID(rs.getInt("parentID"));
				}
	    		r.setRegionAbbr(rs.getString("regionAbbr"));
	    		if(rs.getString("ordinal") == null){
	    			r.setOrdinal(null);
	    		}else{
	    			r.setOrdinal(rs.getInt("ordinal"));
	    		}
	    		//cr字段
	    		cr.setRegionID(r.getRegionID());
	    		cr.setRegionName(r.getRegionName());
	    		cr.setRegionLevel(r.getRegionLevel());
	    		cr.setRegionAbbr(r.getRegionAbbr());
	    		rgs.add(r);
	    		crMap.put(r.getRegionID(), cr);
			}
		} catch (SQLException e) {
			log.error("query wdyq_region failed, sql = " + sql, e);
			e.printStackTrace();
		}finally{
			C3P0Util.closeRs(rs);
			C3P0Util.closeStmt(stmt);
			C3P0Util.closeConn(conn);
		}
		//组装父子关系,省份关系
		for(Region r : rgs){
			CRegion cr = crMap.get(r.getRegionID());
			cr.childRegions = new ArrayList<CRegion>();
    		//如果对应的 r 存在父节点ID,则设置cr的父节点,并把cr添加到父节点的孩子列表中
    		if (r.getParentID() != null && r.getParentID() >= 0){
    			CRegion parentRegion = crMap.get(r.getParentID());
    			if (null != parentRegion){
	    			cr.parentRegion = parentRegion;
	    			//设置子关系
	    			if (parentRegion.childRegions == null)
	    				parentRegion.childRegions = new ArrayList<CRegion>();
	    			parentRegion.childRegions.add(cr);
    			} else{
    				System.out.println(String.format("错误:区域[%d][%s]的上级区域[%d]不存在,请检查.", r.getRegionID(), r.getRegionName(), r.getParentID()));
    				// 没有父节点,则是一个根节点,直接添加到 regions
        			regions.add(cr);
    			}
    		} else{
    			// 没有父节点,则是一个根节点,直接添加到 regions
    			regions.add(cr);
    		}
    		//设置省份节点
    		if (r.getProvinceID() != null && r.getProvinceID() >= 0){
    			cr.provinceRegion = crMap.get(r.getProvinceID());
    		}
		}
		return regions;
	}
}