Package org.beangle.ems.security.restrict.service

Source Code of org.beangle.ems.security.restrict.service.CsvDataResolver

/* 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";
  }

}
TOP

Related Classes of org.beangle.ems.security.restrict.service.CsvDataResolver

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.