View Javadoc

1   /*
2    * $Id: IndexesModels.java,v 1.18 2011/06/16 09:29:41 jbmeslin Exp $
3    */
4   package org.rcfaces.core.model;
5   
6   import java.util.ArrayList;
7   import java.util.Collection;
8   import java.util.List;
9   import java.util.Map;
10  import java.util.RandomAccess;
11  
12  import javax.faces.model.DataModel;
13  
14  import org.rcfaces.core.internal.tools.ArrayIndexesModel;
15  
16  /**
17   * IIndexesModel constructors.
18   * 
19   * 
20   * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
21   * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:41 $
22   */
23  public class IndexesModels {
24      private static final String REVISION = "$Revision: 1.18 $";
25  
26      private static final Object[] OBJECT_EMPTY_ARRAY = new Object[0];
27  
28      /**
29       * Returns an IIndexesModel which all items are selected.
30       * 
31       * @param length
32       *            Number of item of the selection.
33       */
34      public static IIndexesModel selectAll(int length) {
35          int s[] = new int[length];
36          for (int i = 0; i < length; i++) {
37              s[i] = i;
38          }
39  
40          return new ArrayIndexesModel(s);
41      }
42  
43      public static IIndexesModel selectAll(Collection collection, int length) {
44          IIndexesModel indexesModel = new CollectionIndexesModel(collection);
45  
46          select(indexesModel, 0, length);
47  
48          return indexesModel;
49      }
50  
51      public static IIndexesModel selectAll(Map map, int length) {
52          IIndexesModel indexesModel = new MapIndexesModel(map);
53  
54          select(indexesModel, 0, length);
55  
56          return indexesModel;
57      }
58  
59      public static void select(IIndexesModel model, int start, int length) {
60  
61          for (int i = 0; i < length; i++) {
62              model.addIndex(start + i);
63          }
64      }
65  
66      public static Object[] listSelectedObject(Object destination[],
67              Object value, IIndexesModel indexesModel) {
68          if (indexesModel == null) {
69              throw new NullPointerException("IndexesModel is null !");
70          }
71  
72          int indexes[] = indexesModel.listSortedIndexes();
73          if (value == null || indexes == null || indexes.length < 1) {
74              return OBJECT_EMPTY_ARRAY;
75          }
76  
77          if (value instanceof Object[]) {
78              Object values[] = (Object[]) value;
79  
80              List l = new ArrayList(indexes.length);
81              for (int i = 0; i < indexes.length; i++) {
82                  int idx = indexes[i];
83                  if (idx < 0 || idx >= values.length) {
84                      continue;
85                  }
86  
87                  l.add(values[idx]);
88              }
89  
90              return l.toArray(destination);
91          }
92  
93          if (value instanceof Collection) {
94              if (value instanceof RandomAccess) {
95                  List values = (List) value;
96                  int valuesLength = values.size();
97  
98                  List l = new ArrayList(indexes.length);
99                  for (int i = 0; i < indexes.length; i++) {
100                     int idx = indexes[i];
101                     if (idx < 0 || idx >= valuesLength) {
102                         continue;
103                     }
104 
105                     l.add(values.get(idx));
106                 }
107 
108                 return l.toArray(destination);
109 
110             }
111 
112             Object values[] = ((Collection) value).toArray();
113 
114             List l = new ArrayList(indexes.length);
115             for (int i = 0; i < indexes.length; i++) {
116                 int idx = indexes[i];
117                 if (idx < 0 || idx >= values.length) {
118                     continue;
119                 }
120 
121                 l.add(values[idx]);
122             }
123 
124             return l.toArray(destination);
125         }
126 
127         if (value instanceof DataModel) {
128             DataModel dataModel = (DataModel) value;
129 
130             boolean closeDataModel = false;
131             try {
132                 List l = new ArrayList(indexes.length);
133                 for (int i = 0; i < indexes.length; i++) {
134                     int idx = indexes[i];
135                     if (idx < 0) {
136                         continue;
137                     }
138 
139                     dataModel.setRowIndex(idx);
140                     closeDataModel = true;
141 
142                     if (dataModel.isRowAvailable() == false) {
143                         continue;
144                     }
145 
146                     l.add(dataModel.getRowData());
147                 }
148 
149                 return l.toArray(destination);
150 
151             } finally {
152                 if (closeDataModel) {
153                     dataModel.setRowIndex(-1);
154                 }
155             }
156         }
157 
158         throw new IllegalArgumentException("Value type '" + value.getClass()
159                 + "' is not supported !");
160     }
161 
162     public static Object getFirstSelectedObject(Object value,
163             IIndexesModel indexesModel) {
164         if (indexesModel == null) {
165             throw new NullPointerException("IndexesModel is null !");
166         }
167 
168         int index = indexesModel.getFirstIndex();
169         if (value == null || index < 0) {
170             return null;
171         }
172 
173         if (value instanceof Object[]) {
174             Object values[] = (Object[]) value;
175 
176             return values[index];
177         }
178 
179         if (value instanceof List) {
180             List values = (List) value;
181 
182             return values.get(index);
183         }
184 
185         if (value instanceof Collection) {
186             if (index == 0) {
187                 return ((Collection) value).iterator().next();
188             }
189 
190             Object values[] = ((Collection) value).toArray();
191 
192             return values[index];
193         }
194 
195         if (value instanceof DataModel) {
196             DataModel dataModel = (DataModel) value;
197 
198             if (dataModel instanceof IRangeDataModel) {
199                 ((IRangeDataModel) dataModel).setRowRange(index, 1);
200             }
201             dataModel.setRowIndex(index);
202             try {
203                 if (dataModel.isRowAvailable() == false) {
204                     return null;
205                 }
206 
207                 return dataModel.getRowData();
208             } finally {
209                 dataModel.setRowIndex(-1);
210             }
211         }
212 
213         throw new IllegalArgumentException("Value type '" + value.getClass()
214                 + "' is not supported !");
215     }
216 }