001    /*
002     * Apache License
003     * Version 2.0, January 2004
004     * http://www.apache.org/licenses/
005     *
006     * Copyright 2008 by chenillekit.org
007     *
008     * Licensed under the Apache License, Version 2.0 (the "License");
009     * you may not use this file except in compliance with the License.
010     * You may obtain a copy of the License at
011     *
012     * http://www.apache.org/licenses/LICENSE-2.0
013     */
014    
015    package org.chenillekit.tapestry.core.models;
016    
017    import java.util.ArrayList;
018    import java.util.Arrays;
019    import java.util.List;
020    
021    import org.apache.tapestry5.OptionGroupModel;
022    import org.apache.tapestry5.OptionModel;
023    import org.apache.tapestry5.internal.OptionModelImpl;
024    import org.apache.tapestry5.ioc.internal.util.InternalUtils;
025    import org.apache.tapestry5.ioc.services.PropertyAccess;
026    import org.apache.tapestry5.ioc.services.PropertyAdapter;
027    import org.apache.tapestry5.util.AbstractSelectModel;
028    
029    import org.chenillekit.tapestry.core.encoders.MultipleValueEncoder;
030    
031    /**
032     * @version $Id: GenericMultipleSelectModel.java 670 2010-07-19 09:22:02Z mlusetti $
033     */
034    public class GenericMultipleSelectModel<T> extends AbstractSelectModel implements MultipleValueEncoder<T>
035    {
036        private List<PropertyAdapter> _labelFieldAdapters = new ArrayList<PropertyAdapter>();
037        private PropertyAdapter _idFieldAdapter;
038        private List<T> _selectables;
039    
040        public GenericMultipleSelectModel(List<T> selectables, Class clasz, String labelPropertyName, String valuePropertyName, PropertyAccess access)
041        {
042            assert InternalUtils.isNonBlank(labelPropertyName);
043            _selectables = selectables;
044    
045            if (valuePropertyName != null)
046                _idFieldAdapter = access.getAdapter(clasz).getPropertyAdapter(valuePropertyName);
047    
048            if (labelPropertyName != null)
049            {
050                String[] labels = labelPropertyName.split(",");
051                for (String label : labels)
052                    _labelFieldAdapters.add(access.getAdapter(clasz).getPropertyAdapter(label));
053            }
054        }
055    
056        public List<OptionGroupModel> getOptionGroups()
057        {
058            return null;
059        }
060    
061        public List<OptionModel> getOptions()
062        {
063            List<OptionModel> optionModelList = new ArrayList<OptionModel>();
064    
065            if (_labelFieldAdapters.size() == 0)
066            {
067                for (T obj : _selectables)
068                    optionModelList.add(new OptionModelImpl(nvl(obj), obj));
069            }
070            else
071            {
072                for (T obj : _selectables)
073                {
074                    String label = "";
075                    for (int i = 0; i < _labelFieldAdapters.size(); i++)
076                    {
077                        PropertyAdapter propertyAdapter = _labelFieldAdapters.get(i);
078                        if (i > 0)
079                            label += "|" + nvl(propertyAdapter.get(obj));
080                        else
081                            label += nvl(propertyAdapter.get(obj));
082                    }
083    
084                    optionModelList.add(new OptionModelImpl(label, obj));
085                }
086            }
087    
088            return optionModelList;
089        }
090    
091        // ValueEncoder functions
092        public String toClient(T obj)
093        {
094            if (_idFieldAdapter == null)
095                return obj + "";
096            else
097                return _idFieldAdapter.get(obj) + "";
098        }
099    
100        public List<T> toValue(String[] strings)
101        {
102            try
103            {
104                List<String> selectedList = Arrays.asList(strings);
105                List<T> valueList = new ArrayList<T>();
106                for (String selected : selectedList)
107                {
108                    for (T value : _selectables)
109                    {
110                        if (selected.equals(_idFieldAdapter.get(value).toString()))
111                            valueList.add(value);
112                    }
113                }
114                return valueList;
115            }
116            catch (NullPointerException e)
117            {
118                return new ArrayList<T>();
119            }
120        }
121    
122        private String nvl(Object o)
123        {
124            if (o == null)
125                return "";
126            else
127                return o.toString();
128        }
129    }