处理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);
}
}