blob: 2bb5a0bfbc8cac955258e39ad12117a05fb45d65 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.apache.ofbiz.base.conversion;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.ofbiz.base.util.StringUtil;
import org.apache.ofbiz.base.util.UtilGenerics;
/** Collection Converter classes. */
public class CollectionConverters implements ConverterLoader {
public static class ArrayCreator implements ConverterCreator, ConverterLoader {
public void loadConverters() {
Converters.registerCreator(this);
}
public <S, T> Converter<S, T> createConverter(Class<S> sourceClass, Class<T> targetClass) {
if (!sourceClass.isArray()) {
return null;
}
if (targetClass != List.class) {
return null;
}
if (!(sourceClass.getComponentType() instanceof Object)) {
return null;
}
return UtilGenerics.cast(new ArrayClassToList<S, T>(sourceClass, targetClass));
}
}
private static class ArrayClassToList<S, T> extends AbstractConverter<S, T> {
public ArrayClassToList(Class<S> sourceClass, Class<T> targetClass) {
super(sourceClass, targetClass);
}
@Override
public boolean canConvert(Class<?> sourceClass, Class<?> targetClass) {
return sourceClass == this.getSourceClass() && targetClass == this.getTargetClass();
}
public T convert(S obj) throws ConversionException {
List<Object> list = new LinkedList<Object>();
int len = Array.getLength(obj);
for (int i = 0; i < len; i++) {
list.add(Array.get(obj, i));
}
return UtilGenerics.<T>cast(list);
}
}
public static class ArrayToList<T> extends AbstractConverter<T[], List<T>> {
public ArrayToList() {
super(Object[].class, List.class);
}
@Override
public boolean canConvert(Class<?> sourceClass, Class<?> targetClass) {
if (!sourceClass.isArray()) {
return false;
}
if (!List.class.isAssignableFrom(targetClass)) {
return false;
}
if (Object[].class.isAssignableFrom(sourceClass)) {
return true;
}
return false;
}
public List<T> convert(T[] obj) throws ConversionException {
return Arrays.asList(obj);
}
}
public static class ListToString<T> extends AbstractConverter<List<T>, String> {
public ListToString() {
super(List.class, String.class);
}
public String convert(List<T> obj) throws ConversionException {
return obj.toString();
}
}
public static class MapToList<K, V> extends AbstractConverter<Map<K, V>, List<Map<K, V>>> {
public MapToList() {
super(Map.class, List.class);
}
public List<Map<K, V>> convert(Map<K, V> obj) throws ConversionException {
List<Map<K, V>> tempList = new LinkedList<Map<K, V>>();
tempList.add(obj);
return tempList;
}
}
public static class MapToSet<K, V> extends AbstractConverter<Map<K, V>, Set<Map<K, V>>> {
public MapToSet() {
super(Map.class, Set.class);
}
public Set<Map<K, V>> convert(Map<K, V> obj) throws ConversionException {
Set<Map<K, V>> tempSet = new HashSet<Map<K, V>>();
tempSet.add(obj);
return tempSet;
}
}
public static class MapToString<K, V> extends AbstractConverter<Map<K, V>, String> {
public MapToString() {
super(Map.class, String.class);
}
public String convert(Map<K, V> obj) throws ConversionException {
return obj.toString();
}
}
public static class StringToList extends GenericSingletonToList<String> {
public StringToList() {
super(String.class);
}
@Override
public List<String> convert(String obj) throws ConversionException {
if (obj.startsWith("[") && obj.endsWith("]")) {
return StringUtil.toList(obj);
} else {
return super.convert(obj);
}
}
}
public static class StringToMap extends AbstractConverter<String, Map<String, String>> {
public StringToMap() {
super(String.class, Map.class);
}
public Map<String, String> convert(String obj) throws ConversionException {
if (obj.startsWith("{") && obj.endsWith("}")) {
return StringUtil.toMap(obj);
}
throw new ConversionException("Could not convert " + obj + " to Map: ");
}
}
public static class StringToSet extends GenericSingletonToSet<String> {
public StringToSet() {
super(String.class);
}
@Override
public Set<String> convert(String obj) throws ConversionException {
if (obj.startsWith("[") && obj.endsWith("]")) {
return StringUtil.toSet(obj);
} else {
return super.convert(obj);
}
}
}
public void loadConverters() {
Converters.loadContainedConverters(CollectionConverters.class);
}
}