Skip to content

Commit

Permalink
refs #35
Browse files Browse the repository at this point in the history
@XlsHorizontalRecords,@XlsVerticalRecordsの付与するクラスタイプをCollectionに対応。
  • Loading branch information
mygreen committed Jul 15, 2015
1 parent 720be46 commit 6b10f0a
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 34 deletions.
74 changes: 74 additions & 0 deletions src/main/java/com/gh/mygreen/xlsmapper/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

Expand Down Expand Up @@ -1986,4 +1989,75 @@ public static String removeEscapeChar(final String str, final char escapeChar) {
return sb.toString();

}

/**
* Listのインスタンスを他のCollectionのインスタンスに変換する。
* <p>ただし、変換先のクラスタイプがインタフェースの場合は変換しない。
* <p>変換元のクラスと変換先のクラスが同じ場合は、変換しない。
*
* @since 1.0
* @param list 変換元のListのインスタンス
* @param toClass 変換先のCollectionのクラス
* @param config てインスタンス生成するために使用する。{@link XlsMapperConfig#g}
* @return 変換したコレクションのインスタンス
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public static Collection convertListToCollection(final List list, final Class<Collection> toClass,
final FactoryCallback<Class<?>, Object> beanFactory) {

if(list.getClass().equals(toClass)) {
return list;
}

if(toClass.isInterface()) {
if(List.class.isAssignableFrom(toClass)) {
// 変換先がListの実態の場合はそのまま。
return list;

} else if(Set.class.isAssignableFrom(toClass)) {

Collection value = (Collection) beanFactory.create(LinkedHashSet.class);
value.addAll(list);
return value;

} else if(Queue.class.isAssignableFrom(toClass)) {

Collection value = (Collection) beanFactory.create(LinkedList.class);
value.addAll(list);
return value;

} else if(Collection.class.isAssignableFrom(toClass)) {
Collection value = (Collection) beanFactory.create(ArrayList.class);
value.addAll(list);
return value;

} else {
throw new IllegalArgumentException("not support class type:" + toClass.getName());
}

}

Collection value = (Collection) beanFactory.create(toClass);
value.addAll(list);

return value;

}

/**
* CollectionのインスタンスをListに変換する。
*
* @since 1.0
* @param collection 変換元のCollectionのインスタンス。
* @return 変換したListのインスタンス。
*/
public static <T> List<T> convertCollectionToList(final Collection<T> collection) {

if(List.class.isAssignableFrom(collection.getClass())) {
return (List<T>)collection;
}

return new ArrayList<>(collection);

}
}
11 changes: 10 additions & 1 deletion src/main/java/com/gh/mygreen/xlsmapper/XlsMapperConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -241,12 +241,21 @@ public XlsMapperConfig setFieldProcessorRegistry(FieldProcessorRegstry fieldProc
}

/**
* BeanのFactoryクラスを設定します
* Beanを生成するためのFactoryクラスを設定します
* @return
*/
public XlsMapperConfig setBeanFactory(FactoryCallback<Class<?>, Object> beanFactory) {
this.beanFactory = beanFactory;
return this;
}

/**
* Beanを生成するためのFactoryクラスを取得します。
* @since 1.0
* @return
*/
public FactoryCallback<Class<?>, Object> getBeanFactory() {
return beanFactory;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -430,17 +430,7 @@ public Class<?> getTargetClass() {
*/
public Class<?> getLoadingGenericClassType() {

if(List.class.isAssignableFrom(targetClass)) {
if(withField) {
final ParameterizedType type = (ParameterizedType) targetField.getGenericType();
return (Class<?>) type.getActualTypeArguments()[0];

} else {
final ParameterizedType type = (ParameterizedType) targetSetter.getGenericParameterTypes()[0];
return (Class<?>) type.getActualTypeArguments()[0];
}

} else if(Set.class.isAssignableFrom(targetClass)) {
if(Collection.class.isAssignableFrom(targetClass)) {
if(withField) {
final ParameterizedType type = (ParameterizedType) targetField.getGenericType();
return (Class<?>) type.getActualTypeArguments()[0];
Expand Down Expand Up @@ -475,17 +465,7 @@ public Class<?> getLoadingGenericClassType() {
*/
public Class<?> getSavingGenericClassType() {

if(List.class.isAssignableFrom(targetClass)) {
if(withField) {
ParameterizedType type = (ParameterizedType) targetField.getGenericType();
return (Class<?>) type.getActualTypeArguments()[0];

} else {
ParameterizedType type = (ParameterizedType) targetGetter.getGenericReturnType();
return (Class<?>) type.getActualTypeArguments()[0];
}

} else if(Set.class.isAssignableFrom(targetClass)) {
if(Collection.class.isAssignableFrom(targetClass)) {
if(withField) {
ParameterizedType type = (ParameterizedType) targetField.getGenericType();
return (Class<?>) type.getActualTypeArguments()[0];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -58,7 +59,7 @@
/**
* アノテーション{@link XlsHorizontalRecords}を処理するクラス。
*
* @version 0.5
* @version 1.0
* @author Naoki Takezoe
* @author T.TSUCHIE
*
Expand All @@ -82,17 +83,20 @@ public void loadProcess(final Sheet sheet, final Object obj, final XlsHorizontal
}

final Class<?> clazz = adaptor.getTargetClass();
if(List.class.isAssignableFrom(clazz)) {
if(Collection.class.isAssignableFrom(clazz)) {

Class<?> recordClass = anno.recordClass();
if(recordClass == Object.class) {
recordClass = adaptor.getLoadingGenericClassType();
}

final List<?> value = loadRecords(sheet, anno, adaptor, recordClass, config, work);
List<?> value = loadRecords(sheet, anno, adaptor, recordClass, config, work);
if(value != null) {
adaptor.setValue(obj, value);
@SuppressWarnings({"unchecked", "rawtypes"})
Collection<?> collection = Utils.convertListToCollection(value, (Class<Collection>)clazz, config.getBeanFactory());
adaptor.setValue(obj, collection);
}

} else if(clazz.isArray()) {

Class<?> recordClass = anno.recordClass();
Expand Down Expand Up @@ -486,14 +490,15 @@ public void saveProcess(final Sheet sheet, final Object obj, final XlsHorizontal

final Class<?> clazz = adaptor.getTargetClass();
final Object result = adaptor.getValue(obj);
if(List.class.isAssignableFrom(clazz)) {
if(Collection.class.isAssignableFrom(clazz)) {

Class<?> recordClass = anno.recordClass();
if(recordClass == Object.class) {
recordClass = adaptor.getSavingGenericClassType();
}

final List<Object> list = (result == null ? new ArrayList<Object>() : (List<Object>) result);
final Collection<Object> value = (result == null ? new ArrayList<Object>() : (Collection<Object>) result);
final List<Object> list = Utils.convertCollectionToList(value);
saveRecords(sheet, anno, adaptor, recordClass, list, config, work);

} else if(clazz.isArray()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -53,7 +54,8 @@

/**
* アノテーション{@link XlsVerticalRecords}を処理するクラス。
*
*
* @version 1.0
* @author Naoki Takezoe
* @author T.TSUCHIE
*
Expand All @@ -75,7 +77,7 @@ public void loadProcess(final Sheet sheet, final Object obj, final XlsVerticalRe
}

final Class<?> clazz = adaptor.getTargetClass();
if(List.class.isAssignableFrom(clazz)) {
if(Collection.class.isAssignableFrom(clazz)) {

Class<?> recordClass = anno.recordClass();
if(recordClass == Object.class) {
Expand All @@ -84,7 +86,9 @@ public void loadProcess(final Sheet sheet, final Object obj, final XlsVerticalRe

final List<?> value = loadRecords(sheet, anno, adaptor, recordClass, config, work);
if(value != null) {
adaptor.setValue(obj, value);
@SuppressWarnings({"unchecked", "rawtypes"})
Collection<?> collection = Utils.convertListToCollection(value, (Class<Collection>)clazz, config.getBeanFactory());
adaptor.setValue(obj, collection);
}
} else if(clazz.isArray()) {

Expand Down Expand Up @@ -482,14 +486,15 @@ public void saveProcess(final Sheet sheet, final Object obj, final XlsVerticalRe

final Class<?> clazz = adaptor.getTargetClass();
final Object result = adaptor.getValue(obj);
if(List.class.isAssignableFrom(clazz)) {
if(Collection.class.isAssignableFrom(clazz)) {

Class<?> recordClass = anno.recordClass();
if(recordClass == Object.class) {
recordClass = adaptor.getSavingGenericClassType();
}

final List<Object> list = (result == null ? new ArrayList<Object>() : (List<Object>) result);
final Collection<Object> value = (result == null ? new ArrayList<Object>() : (Collection<Object>) result);
final List<Object> list = Utils.convertCollectionToList(value);
saveRecords(sheet, anno, adaptor, recordClass, list, config, work);

} else if(clazz.isArray()) {
Expand Down

0 comments on commit 6b10f0a

Please sign in to comment.