001 /*
002 * Copyright 2002-2006 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy
006 * of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations
014 * under the License.
015 */
016 package org.springframework.richclient.convert.support;
017
018 import org.springframework.binding.convert.ConversionContext;
019 import org.springframework.binding.convert.Converter;
020 import org.springframework.binding.convert.support.AbstractConverter;
021 import org.springframework.core.ReflectiveVisitorHelper;
022
023 import java.util.ArrayList;
024 import java.util.Arrays;
025 import java.util.Collection;
026 import java.util.Collections;
027 import java.util.List;
028
029 /**
030 * This converter converts collection values from Object, Object[], Collection, List to Collection.class, List.class,
031 * Object[].class types
032 *
033 * @author Mathias Broekelmann
034 *
035 */
036 public class CollectionConverter extends AbstractConverter implements Converter {
037
038 private static final Class[] SOURCE_CLASSES = new Class[] { Object.class, Collection.class, List.class,
039 Object[].class };
040
041 private static final Class[] TARGET_CLASSES = new Class[] { Collection.class, List.class, Object[].class };
042
043 private final ReflectiveVisitorHelper visitorHelper = new ReflectiveVisitorHelper();
044
045 private Object visitor = new ValuesVisitor();
046
047 protected Object doConvert(Object sourceValue, Class targetClass, ConversionContext context) throws Exception {
048 List values = (List) visitorHelper.invokeVisit(visitor, sourceValue);
049 if (Object[].class == targetClass) {
050 return values.toArray();
051 }
052 return values;
053 }
054
055 public Class[] getSourceClasses() {
056 return SOURCE_CLASSES;
057 }
058
059 public Class[] getTargetClasses() {
060 return TARGET_CLASSES;
061 }
062
063 protected static class ValuesVisitor {
064 List visitNull() {
065 return Collections.EMPTY_LIST;
066 }
067
068 List visit(Object value) {
069 return visit(new Object[] { value });
070 }
071
072 List visit(Collection values) {
073 return new ArrayList(values);
074 }
075
076 List visit(List values) {
077 return values;
078 }
079
080 List visit(Object[] values) {
081 return Arrays.asList(values);
082 }
083 }
084
085 }