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 }