001// Copyright 2004, 2005 The Apache Software Foundation 002// 003// Licensed under the Apache License, Version 2.0 (the "License"); 004// you may not use this file except in compliance with the License. 005// You may obtain a copy of the License at 006// 007// http://www.apache.org/licenses/LICENSE-2.0 008// 009// Unless required by applicable law or agreed to in writing, software 010// distributed under the License is distributed on an "AS IS" BASIS, 011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012// See the License for the specific language governing permissions and 013// limitations under the License. 014 015package org.apache.tapestry.contrib.table.model.ognl; 016 017import org.apache.tapestry.contrib.table.model.ITableColumn; 018import org.apache.tapestry.contrib.table.model.simple.SimpleTableColumnModel; 019import org.apache.tapestry.services.ExpressionEvaluator; 020 021/** 022 * @author mindbridge 023 */ 024public class ExpressionTableColumnModel extends SimpleTableColumnModel 025{ 026 private static final long serialVersionUID = 1L; 027 028 /** 029 * Constructs a table column model containting OGNL expression columns. <br> 030 * The data for the columns is provided in the form of a string array, where the info of each 031 * column is stored in two consecutive fields in the array, hence its size must be even. The 032 * expected info is the following: 033 * <ul> 034 * <li>Column Name 035 * <li>OGNL expression 036 * </ul> 037 * 038 * @param arrColumnInfo 039 * The information to construct the columns from 040 * @param bSorted 041 * Whether all columns are sorted or not 042 */ 043 public ExpressionTableColumnModel(String[] arrColumnInfo, boolean bSorted, 044 ExpressionEvaluator expressionEvaluator) 045 { 046 this(convertToDetailedArray(arrColumnInfo, bSorted), expressionEvaluator); 047 } 048 049 /** 050 * Constructs a table column model containting OGNL expression columns. <br> 051 * The data for the columns is provided in the form of a string array, where the info of each 052 * column is stored in four consecutive fields in the array, hence its size must be divisible by 053 * 4.<br> 054 * The expected info is the following: 055 * <ul> 056 * <li>Column Name 057 * <li>Display Name 058 * <li>OGNL expression 059 * <li>Sorting of the column. This is either a Boolean, or a String representation of a 060 * boolean. 061 * </ul> 062 * 063 * @param arrColumnInfo 064 */ 065 public ExpressionTableColumnModel(Object[] arrColumnInfo, 066 ExpressionEvaluator expressionEvaluator) 067 { 068 super(convertToColumns(arrColumnInfo, expressionEvaluator)); 069 } 070 071 /** 072 * Method convertToDetailedArray. 073 * 074 * @param arrColumnInfo 075 * @param bSorted 076 * @return Object[] 077 */ 078 protected static Object[] convertToDetailedArray(String[] arrColumnInfo, boolean bSorted) 079 { 080 int nColumns = arrColumnInfo.length / 2; 081 int nSize = nColumns * 4; 082 Object[] arrDetailedInfo = new Object[nSize]; 083 084 for (int i = 0; i < nColumns; i++) 085 { 086 int nInputBaseIndex = 2 * i; 087 String strColumnName = arrColumnInfo[nInputBaseIndex]; 088 String strExpression = arrColumnInfo[nInputBaseIndex + 1]; 089 090 int nOutputBaseIndex = 4 * i; 091 arrDetailedInfo[nOutputBaseIndex] = strColumnName; 092 arrDetailedInfo[nOutputBaseIndex + 1] = strColumnName; 093 arrDetailedInfo[nOutputBaseIndex + 2] = strExpression; 094 arrDetailedInfo[nOutputBaseIndex + 3] = bSorted ? Boolean.TRUE : Boolean.FALSE; 095 } 096 097 return arrDetailedInfo; 098 } 099 100 /** 101 * Method convertToColumns. 102 * 103 * @param arrDetailedInfo 104 * @return ITableColumn[] 105 */ 106 protected static ITableColumn[] convertToColumns(Object[] arrDetailedInfo, 107 ExpressionEvaluator expressionEvaluator) 108 { 109 int nColumns = arrDetailedInfo.length / 4; 110 ITableColumn[] arrColumns = new ITableColumn[nColumns]; 111 112 for (int i = 0; i < nColumns; i++) 113 { 114 Object objTempValue; 115 int nBaseIndex = 4 * i; 116 117 String strColumnName = ""; 118 objTempValue = arrDetailedInfo[nBaseIndex]; 119 if (objTempValue != null) 120 strColumnName = objTempValue.toString(); 121 122 String strDisplayName = ""; 123 objTempValue = arrDetailedInfo[nBaseIndex + 1]; 124 if (objTempValue != null) 125 strDisplayName = objTempValue.toString(); 126 127 String strExpression = ""; 128 objTempValue = arrDetailedInfo[nBaseIndex + 2]; 129 if (objTempValue != null) 130 strExpression = objTempValue.toString(); 131 132 boolean bSorted = false; 133 objTempValue = arrDetailedInfo[nBaseIndex + 3]; 134 if (objTempValue != null) 135 { 136 if (objTempValue instanceof Boolean) 137 bSorted = ((Boolean) objTempValue).booleanValue(); 138 else 139 bSorted = Boolean.valueOf(objTempValue.toString()).booleanValue(); 140 } 141 142 arrColumns[i] = new ExpressionTableColumn(strColumnName, strDisplayName, strExpression, 143 bSorted, expressionEvaluator); 144 } 145 146 return arrColumns; 147 } 148}