Skip to content
WEBCodeTableCache.java 3.51 KiB
Newer Older
package com.cesgroup.zw.codetable;

import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.sql.DataSource;

import org.springframework.core.io.Resource;

import com.cesgroup.zw.common.parse.query.ParseQuery;
import com.cesgroup.zw.core.codetable.CodeGroup;
import com.cesgroup.zw.core.codetable.CodeTableCache;

public class WEBCodeTableCache {

	private CodeTableCache codeTableCache = CodeTableCache.getInstance();
	
	private ParseQuery query;
	
	public WEBCodeTableCache(ParseQuery query) {
		
		this.query = query;
		
	}
	/**
	 * 加载CODETABLE数据
	 * @throws Exception
	 */
	public void loadData() throws Exception {
		
		if(null != dbCodeFiles ) {
			// XML数据流
			InputStream[] dbCodeInputStreams = new InputStream[dbCodeFiles.length];
			for(int i = 0;i < dbCodeFiles.length;i++) {
				dbCodeInputStreams[i] = dbCodeFiles[i].getInputStream();
			}
			codeTableCache.setDbCodeInputStreams(dbCodeInputStreams);
		}
		if(null != xmlCodeFiles ) {
			// DB数据流
			InputStream[] xmlCodeInputStreams  = new InputStream[xmlCodeFiles.length];
			for(int i = 0;i < xmlCodeFiles.length;i++) {
				xmlCodeInputStreams[i] = xmlCodeFiles[i].getInputStream();
			}
			codeTableCache.setXmlCodeInputStreams(xmlCodeInputStreams);
		}		
		codeTableCache.setQuery(query);

		codeTableCache.loadData();
	

	}
	
	public synchronized CodeGroup getGroup(String cacheKey) throws Exception {
		return codeTableCache.getGroup(cacheKey);
	}

	/**
	 * 通过字段取得组信息
	 * @param cacheKey group 名
	 * @param valueName 字段的名称
	 * @param value 字段的值
	 * @return
	 * @throws Exception
	 */	
	
	public synchronized CodeGroup getGroup(String cacheKey,String valueName,String value) throws Exception {
		
		CodeGroup codeGroup = codeTableCache.getGroup(cacheKey);
		Map<String, Object> dataMap = codeGroup.getCodeMap(valueName, value);
		if(null != dataMap) {
			return  new CodeGroup(dataMap,cacheKey,codeGroup.getCodeClass(),codeGroup.getKeyField());
			
		}
		return  new CodeGroup(new HashMap(),cacheKey,codeGroup.getCodeClass(),codeGroup.getKeyField());
		
	}
	
	private Set<Object> getDataSourceTypes(ParseQuery query) {
		DataSource dataSource = null;
		Class<?> clazz = query.getClass();
		for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
			try{
				Field field = clazz.getDeclaredField("dataSource");
				if(null != field ){
					field.setAccessible(true);
					dataSource = (DataSource) field.get(query);
				}
			} catch (Exception e) { 
				            			
			}
		}
	    if(null != dataSource /*&& dataSource instanceof CustomerRoutingDataSource*/) {

			try {
				Method method = dataSource.getClass().getDeclaredMethod("getCodeTableDataSources",new Class[]{});
				if(null != method ){
					method.setAccessible(true);
					return (HashSet<Object>) method.invoke(dataSource,new Object[]{});

				}
			} catch (Exception e) {
				//e.printStackTrace();
				e.printStackTrace();
			}

			//return ((CustomerRoutingDataSource)dataSource).getCodeTableDataSources();

	    }
	    return new HashSet<Object>();
		
	}
	

	
	private Resource[] dbCodeFiles;
	
	private Resource[] xmlCodeFiles;

	public Resource[] getDbCodeFiles() {
		return dbCodeFiles;
	}

	public void setDbCodeFiles(Resource[] dbCodeFiles) {
		this.dbCodeFiles = dbCodeFiles;
	}

	public Resource[] getXmlCodeFiles() {
		return xmlCodeFiles;
	}

	public void setXmlCodeFiles(Resource[] xmlCodeFiles) {
		this.xmlCodeFiles = xmlCodeFiles;
	}
}