天天看點

NC6 處理SuperVO及其子類的工具類。

處理SuperVO及其子類的工具類。

package nc.pub.fa.common.manager;

import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import nc.bs.logging.Logger;
import nc.pub.fa.common.comparator.ReverseComparator;
import nc.pub.fa.common.comparator.SuperVOComparator;
import nc.pub.fa.common.util.StringUtils;
import nc.vo.am.common.util.ArrayUtils;
import nc.vo.am.common.util.CollectionUtils;
import nc.vo.pub.AggregatedValueObject;
import nc.vo.pub.CircularlyAccessibleValueObject;
import nc.vo.pub.SuperVO;

import org.apache.commons.beanutils.PropertyUtils;

/**
 * 處理SuperVO及其子類的工具類。<br>
 * 功能: <br>
 * 1:抽取VO數組中不同狀态的VO子數組,比如抽取新增、修改過的、被删除的的vo <br>
 * 2:從vo數組中擷取某個字段的值,并将其以清單的形式傳回去。<br>
 * 
 */
public class VOManager {

	/**
	 * 将vo數組中主鍵為空的vo抽取出來。可以當成新增的vo數組。
	 * 
	 * @param <T>
	 * @param ts
	 * @return
	 * @author yanjq
	 */
	public static <T extends SuperVO> List<T> extractNewVOs(T... ts) {
		List<T> newList = new ArrayList<T>();
		if (ArrayUtils.isEmpty(ts)) {
			return newList;
		}
		for (T t : ts) {
			if (nc.vo.pub.VOStatus.NEW == t.getStatus()) {
				newList.add(t);
			}
		}
		return newList;
	}

	/**
	 * 将vo數組中主鍵不為空的vo抽取出來。可以當成修改後的vo數組。
	 * 
	 * @param <T>
	 * @param ts
	 * @return
	 * @author yanjq
	 */
	public static <T extends SuperVO> List<T> extractUpdateVOs(T... ts) {
		List<T> newList = new ArrayList<T>();
		if (ArrayUtils.isEmpty(ts)) {
			return newList;
		}
		for (T t : ts) {
			if (nc.vo.pub.VOStatus.UPDATED == t.getStatus()) {
				newList.add(t);
			}
		}
		return newList;
	}

	/**
	 * 将vo數組中主鍵不為空的vo抽取出來。可以當成修改後的vo數組。
	 * 
	 * @param <T>
	 * @param ts
	 * @return
	 * @author yanjq
	 */
	public static <T extends SuperVO> List<T> extractDeleteVOs(T... ts) {
		List<T> newList = new ArrayList<T>();
		if (ArrayUtils.isEmpty(ts)) {
			return newList;
		}
		for (T t : ts) {
			if (nc.vo.pub.VOStatus.DELETED == t.getStatus()) {
				newList.add(t);
			}
		}
		return newList;
	}

	/**
	 * /** 從vo數組中擷取某個字段的值,并将其以數組的形式傳回去 預設是不過濾重複和null值
	 * 
	 * @param <T>
	 * @param <V>
	 * @param vos
	 * @param attrKey
	 * @return
	 * @author yanjq
	 */
	@SuppressWarnings("unchecked")
	public static <T extends CircularlyAccessibleValueObject, V> V[] getAttributeValueArray(T[] vos, String attrKey) {
		List<V> list = getAttributeValueList(vos, attrKey);
		if (list == null || list.size() == 0)
			return null;
		
		
		Class type = null;
		try {
			if (list.get(0) != null) {
				type = list.get(0).getClass();
			} else {
				type = PropertyUtils.getPropertyType(vos[0], attrKey);
			}
			
		} catch (IllegalAccessException e1) {
			Logger.error(e1.getMessage());
		} catch (InvocationTargetException e1) {
			Logger.error(e1.getMessage());
		} catch (NoSuchMethodException e1) {
			Logger.error(e1.getMessage());
		}
		
		V[] values = null;
		try {
			values = (V[]) Array.newInstance(type, list.size());
		} catch (NegativeArraySizeException e) {
			Logger.error(e.getMessage());
		}
		return list.toArray(values);
	}

	/**
	 * 從vo數組中擷取某個字段的值,并将其已清單的形式傳回去 預設是不過濾重複和null值
	 * 
	 * @param <T>
	 * @param <V>
	 * @param vos
	 * @param attrKey
	 * @return
	 * @author yanjq
	 */
	public static <T extends CircularlyAccessibleValueObject, V> List<V> getAttributeValueList(T[] vos, String attrKey) {
		return getAttributeValueList(vos, attrKey, false, false);
	}

	/**
	 * 從VO數組中擷取某個字段的值,将其按集合(Set)的方式傳回去。不過濾null值
	 * 
	 * @param <V>
	 * @param vos
	 * @param attributeName
	 * @return
	 * @author yanjq
	 * @date 2010-5-7
	 */
	@SuppressWarnings("unchecked")
	public static <V> Set<V> getAttributeValueSet(SuperVO[] vos, String attributeName) {
		if (ArrayUtils.isEmpty(vos))
			return Collections.emptySet();

		// V[] values = VOManager.getAttributeValueArray(vos, attributeName);
		
		Set<V> set = new HashSet<V>();
		if (ArrayUtils.isNotEmpty(vos)) {
			for (SuperVO vo : vos) {
				set.add((V) vo.getAttributeValue(attributeName));
			}
		}
		return set;
	}

	/**
	 * 從vo數組中擷取某個字段的值,并将其已清單的形式傳回去
	 * 
	 * @param <T>
	 *            VO 類型
	 * @param <V>
	 *            傳回字段類型
	 * @param vos
	 *            VO數組
	 * @param attrKey
	 *            VO中的字段名稱
	 * @param isFilterEquals
	 *            是否過濾掉重複的資料
	 * @param isFilterNull
	 *            是否過濾掉null值
	 * @return List<V>
	 * @author yanjq
	 */
	@SuppressWarnings("unchecked")
	public static <T extends CircularlyAccessibleValueObject, V> List<V> getAttributeValueList(T[] vos, String attrKey,
			boolean isFilterEquals, boolean isFilterNull) {
		List<V> list = null;
		if (ArrayUtils.isEmpty(vos) || StringUtils.isBlank(attrKey)) {
			list = Collections.emptyList();
			return list;
		}

		list = new ArrayList<V>();
		for (T vo : vos) {
			V value = (V) vo.getAttributeValue(attrKey);

			if (isFilterEquals) {
				// 過濾重複的資料
				if (list.contains(value))
					continue;

				if (isFilterNull) {
					// 過濾重複的資料,并且過濾掉null值
					if (value != null) {
						list.add(value);
					}
				} else {
					// 過濾重複的資料,并且不過濾掉null值
					list.add(value);
				}
			} else {
				// 不過濾重複的資料
				if (isFilterNull) {
					// 不過濾重複的資料,并且過濾掉null值
					if (value != null) {
						list.add(value);
					}
				} else {
					// 不過濾重複的資料,并且不過濾掉null值
					list.add(value);
				}
			}
		}
		return list;
	}

	/**
	 * 将VO數組中所有的VO中某個字段設為同一值
	 * 
	 * @param vos
	 * @param attrKey
	 * @param value
	 */
	public static void setAttributeValue(SuperVO[] vos, String attrKey, Object value) {
		if (ArrayUtils.isEmpty(vos))
			return;
		for (SuperVO vo : vos) {
			vo.setAttributeValue(attrKey, value);
		}
	}

	/**
	 * 将已有的VO值轉換為某一類型的VO對象數組。
	 * 
	 * @param <T>
	 * @param orginVOs
	 * @param distClass
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T extends SuperVO> T[] copyProperties(SuperVO[] orginVOs, Class<T> distClass) {
		if (ArrayUtils.isEmpty(orginVOs)) {
			return null;
		}
		T[] targVOs = null;

		targVOs = (T[]) Array.newInstance(distClass, orginVOs.length);
		for (int i = 0; i < targVOs.length; i++) {
			copyProperties(orginVOs[i], targVOs[i]);
		}

		return targVOs;

	}

	/**
	 * 将已有的VO值轉換為某一類型的VO對象數組。
	 * 
	 * @param <T>
	 * @param orginVOs
	 * @param distClass
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T extends SuperVO> T[] copyProperties(SuperVO[] orginVOs, Class<T> distClass, String... fields) {
		if (ArrayUtils.isEmpty(orginVOs)) {
			return null;
		}
		T[] targVOs = null;

		try {
			targVOs = (T[]) Array.newInstance(distClass, orginVOs.length);
			for (int i = 0; i < targVOs.length; i++) {
				targVOs[i] = distClass.newInstance();
				copyProperties(orginVOs[i], targVOs[i], fields);
			}
		} catch (NegativeArraySizeException e) {
			Logger.error(e.getMessage());
		} catch (InstantiationException e) {
			Logger.error(e.getMessage());
		} catch (IllegalAccessException e) {
			Logger.error(e.getMessage());
		}

		return targVOs;

	}

	/**
	 * 将srcVO中與targVO 具有相同的attrNames字段的值賦給targVO
	 * 
	 * @param srcVO
	 * @param targVO
	 * @param attrNames
	 * @author yanjq
	 * @date 2010-3-3
	 */
	public static void copyProperties(SuperVO srcVO, SuperVO targVO, String... attrNames) {
		if (srcVO == null || targVO == null || ArrayUtils.isEmpty(attrNames))
			return;
		for (String name : attrNames) {
			targVO.setAttributeValue(name, srcVO.getAttributeValue(name));
		}
	}
	
	/**
	 * 将srcVO中與targVO 具有相同的attrNames字段的值賦給targVO
	 * 
	 * @param srcVO
	 * @param targVO
	 * @param attrNames
	 * @author yanjq
	 * @date 2010-3-3
	 */
	public static void copyNotNullProperties(SuperVO srcVO, SuperVO targVO, String... attrNames) {
		if (srcVO == null || targVO == null || ArrayUtils.isEmpty(attrNames))
			return;
		for (String name : attrNames) {
			if(null != srcVO.getAttributeValue(name)){
				targVO.setAttributeValue(name, srcVO.getAttributeValue(name));
			}
		}
	}
	
	/**
	 * 
	 * 
	 * <p>
	 * <b>examples:</b>
	 * <p>
	 * 使用示例
	 * <p>
	 * <b>參數說明</b>
	 * @param srcVO
	 * @param targVO
	 * @param attrNames
	 * <p>
	 * @author weizq
	 * @time 2011-5-14 上午10:29:55
	 */
	public static void notCopyProperties(SuperVO srcVO, SuperVO targVO, String... unAttrNames) {
		if (srcVO == null || targVO == null )
			return;
		
		for (String name : srcVO.getAttributeNames()) {
			if (ArrayUtils.isNotEmpty(unAttrNames)) {
				if (CollectionUtils.convertToList(unAttrNames).contains(name)) {
					continue;
				}
			}
			targVO.setAttributeValue(name, srcVO.getAttributeValue(name));
		}
	}

	/**
	 * 将srcVO中與targVO字段相同的值賦給targVO
	 * 
	 * @param srcVO
	 * @param targVO
	 */
	public static void copyProperties(SuperVO srcVO, SuperVO targVO) {
		if (srcVO == null || targVO == null)
			return;
		for (String name : srcVO.getAttributeNames()) {
			targVO.setAttributeValue(name, srcVO.getAttributeValue(name));
		}
	}

	public static void copyNotNullProperties(SuperVO srcVO, SuperVO targVO) {
		if (srcVO == null || targVO == null)
			return;
		for (String name : srcVO.getAttributeNames()) {
			Object targValue = targVO.getAttributeValue(name);
			if (targValue == null) {
				targVO.setAttributeValue(name, srcVO.getAttributeValue(name));
			}

		}
	}
	
	public static void copyFromNotNullProperties(SuperVO srcVO, SuperVO targVO) {
        if (srcVO == null || targVO == null)
            return;
        for (String name : srcVO.getAttributeNames()) {
            Object srcValue = srcVO.getAttributeValue(name);
            if (srcValue != null) {
                targVO.setAttributeValue(name, srcVO.getAttributeValue(name));
            }

        }
    }

	/**
	 * 擷取表頭VO數組
	 * 
	 * @param vos
	 * @return
	 * @author yanjq
	 * @date 2010-4-13
	 */
	public static SuperVO[] getHeadVOs(AggregatedValueObject... vos) {
		if (ArrayUtils.isEmpty(vos))
			return null;
		SuperVO[] headVOs = (SuperVO[])Array.newInstance(vos[0].getParentVO().getClass(), vos.length);
		
		
		for (int i = 0; i < vos.length; i++) {
			headVOs[i] = (SuperVO) vos[i].getParentVO();
		}
		return headVOs;
	}

	/**
	 * 對AggVO數組進行排序,按表頭資料排序
	 * 
	 * @param vos
	 *            vo數組
	 * @param fields
	 *            進行排序的字段
	 * @param isAsc
	 *            是否升序
	 */
	public static void sort(AggregatedValueObject[] vos, String[] fields, boolean isAsc) {

		if (ArrayUtils.isEmpty(vos) || ArrayUtils.isEmpty(fields)) {
			return;
		}

		SuperVO[] headVOs = getHeadVOs(vos);
		Comparator<SuperVO> c = new SuperVOComparator(fields);
		if (!isAsc) {
			c = new ReverseComparator<SuperVO>(c);
		}
		Arrays.sort(headVOs, c);

		Set<Integer> finded = new HashSet<Integer>();
		for (int j = 0; j < vos.length; j++) {
			// 找到正确的位置。
			int w = j;
			for (int i = 0; i < headVOs.length; i++) {
				if (!finded.contains(i) && vos[j].getParentVO() == headVOs[i]) {
					w = i;
					finded.add(i);
					break;
				}
			}
			// 位置不一樣才互換。
			if (w != j) {
				AggregatedValueObject obj = vos[j];
				vos[j] = vos[w];
				vos[w] = obj;
			}
		}
	}

	/**
	 * 對VO數組進行排序
	 * 
	 * @param vos
	 *            vo數組
	 * @param fields
	 *            進行排序的字段
	 * @param isAsc
	 *            是否升序
	 */
	public static void sort(SuperVO[] vos, String[] fields, boolean isAsc) {

		if (ArrayUtils.isEmpty(vos) || ArrayUtils.isEmpty(fields)) {
			return;
		}
		Comparator<SuperVO> c = new SuperVOComparator(fields);
		if (!isAsc) {
			c = new ReverseComparator<SuperVO>(c);
		}
		Arrays.sort(vos, c);
	}

	/**
	 * 對VO清單進行排序
	 * 
	 * @param voList
	 *            清單
	 * @param fields
	 *            進行排序的字段
	 * @param isAsc
	 *            是否升序
	 */
	public static void sort(List<SuperVO> voList, String[] fields, boolean isAsc) {

		if (CollectionUtils.isEmpty(voList) || ArrayUtils.isEmpty(fields))
			return;
		Comparator<SuperVO> c = new SuperVOComparator(fields);
		if (!isAsc) {
			c = new ReverseComparator<SuperVO>(c);
		}
		Collections.sort(voList, c);
	}
}

           
nc

繼續閱讀