Java tutorial
/* Copyright c 2005-2012. * Licensed under GNU LESSER General Public License, Version 3. * http://www.gnu.org/licenses */ package org.beangle.ems.security.restrict.service; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConvertUtilsBean; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang.StringUtils; import org.beangle.commons.collection.CollectUtils; import org.beangle.commons.converters.Converter; import org.beangle.ems.security.restrict.RestrictField; /** * Store list of objects using comma. * <p> * object's property seperated by ; like this: id;name,1;group1,2;group2 * * @author chaostone */ public class CsvDataResolver implements DataResolver, DataProvider { public String marshal(RestrictField field, Collection<?> items) { if (null == items) { return null; } List<String> properties = CollectUtils.newArrayList(); if (null != field.getKeyName()) { properties.add(field.getKeyName()); } if (null != field.getPropertyNames()) { String[] names = StringUtils.split(field.getPropertyNames(), ","); properties.addAll(Arrays.asList(names)); } StringBuilder sb = new StringBuilder(); if (properties.isEmpty()) { for (Object obj : items) { if (null != obj) { sb.append(String.valueOf(obj)).append(','); } } } else { for (String property : properties) { sb.append(property).append(';'); } sb.deleteCharAt(sb.length() - 1).append(','); for (Object obj : items) { for (String property : properties) { Object value = null; try { value = PropertyUtils.getProperty(obj, property); } catch (Exception e) { e.printStackTrace(); } sb.append(String.valueOf(value)).append(';'); } sb.deleteCharAt(sb.length() - 1); sb.append(','); } } if (sb.length() > 0) { sb.deleteCharAt(sb.length() - 1); } return sb.toString(); } @SuppressWarnings("unchecked") public <T> List<T> unmarshal(RestrictField field, String source) { if (StringUtils.isEmpty(source)) { return Collections.emptyList(); } List<String> properties = CollectUtils.newArrayList(); if (null != field.getKeyName()) { properties.add(field.getKeyName()); } if (null != field.getPropertyNames()) { String[] names = StringUtils.split(field.getPropertyNames(), ","); properties.addAll(Arrays.asList(names)); } String[] datas = StringUtils.split(source, ","); try { Class<?> type = null; type = Class.forName(field.getType()); List<T> rs = CollectUtils.newArrayList(); if (properties.isEmpty()) { ConvertUtilsBean converter = Converter.getDefault(); for (String data : datas) { rs.add((T) converter.convert(data, type)); } return rs; } else { properties.clear(); int startIndex = 0; String[] names = new String[] { field.getKeyName() }; if (-1 != datas[0].indexOf(';')) { names = StringUtils.split(datas[0], ";"); startIndex = 1; } properties.addAll(Arrays.asList(names)); for (int i = startIndex; i < datas.length; i++) { Object obj = type.newInstance(); String[] dataItems = StringUtils.split(datas[i], ";"); for (int j = 0; j < properties.size(); j++) { BeanUtils.setProperty(obj, properties.get(j), dataItems[j]); } rs.add((T) obj); } } return rs; } catch (Exception e) { throw new RuntimeException(e); } } public <T> List<T> getData(RestrictField field, String source) { return unmarshal(field, source); } public String getName() { return "csv"; } }