02a3de4ecca588df80b9c1794a55d38459368985
[portal/sdk.git] /
1 /*
2  * ============LICENSE_START==========================================
3  * ONAP Portal SDK
4  * ===================================================================
5  * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6  * ===================================================================
7  *
8  * Unless otherwise specified, all software contained herein is licensed
9  * under the Apache License, Version 2.0 (the "License");
10  * you may not use this software except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *             http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  * Unless otherwise specified, all documentation contained herein is licensed
22  * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
23  * you may not use this documentation except in compliance with the License.
24  * You may obtain a copy of the License at
25  *
26  *             https://creativecommons.org/licenses/by/4.0/
27  *
28  * Unless required by applicable law or agreed to in writing, documentation
29  * distributed under the License is distributed on an "AS IS" BASIS,
30  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
31  * See the License for the specific language governing permissions and
32  * limitations under the License.
33  *
34  * ============LICENSE_END============================================
35  *
36  * 
37  */
38 package org.onap.portalsdk.analytics.model.runtime;
39
40 import java.util.Calendar;
41 import java.util.Collections;
42 import java.util.Iterator;
43 import java.util.List;
44 import java.util.Vector;
45
46 import javax.servlet.http.HttpServletRequest;
47
48 import org.onap.portalsdk.analytics.error.RaptorException;
49 import org.onap.portalsdk.analytics.model.DataCache;
50 import org.onap.portalsdk.analytics.model.base.ReportWrapper;
51 import org.onap.portalsdk.analytics.system.AppUtils;
52 import org.onap.portalsdk.analytics.system.ConnectionUtils;
53 import org.onap.portalsdk.analytics.system.Globals;
54 import org.onap.portalsdk.analytics.util.AppConstants;
55 import org.onap.portalsdk.analytics.util.DataSet;
56 import org.onap.portalsdk.analytics.util.Utils;
57 import org.onap.portalsdk.analytics.xmlobj.ColFilterType;
58 import org.onap.portalsdk.analytics.xmlobj.DataColumnType;
59 import org.onap.portalsdk.analytics.xmlobj.FormFieldType;
60 import org.onap.portalsdk.core.util.SecurityCodecUtil;
61 import org.owasp.esapi.ESAPI;
62
63 public class ReportFormFields extends Vector {
64         private int nextElemIdx = 0;
65
66         public ReportFormFields(ReportWrapper rw, HttpServletRequest request) throws RaptorException {
67                 super();
68
69                 if (rw.getFormFieldList() != null)
70                         for (Iterator iter = rw.getFormFieldList().getFormField().iterator(); iter
71                                         .hasNext();) {
72                                 FormFieldType fft = (FormFieldType) iter.next();
73
74                                 String fieldName = fft.getFieldId();
75                                 String fieldDisplayName = fft.getFieldName();
76                                 String fieldType = fft.getFieldType();
77                                 String validationType = fft.getValidationType();
78                                 String mandatory = nvl(fft.getMandatory(), "N");
79                                 String defaultValue = fft.getDefaultValue();
80                                 String fieldSQL = fft.getFieldSQL();
81                 String fieldDefaultSQL = fft.getFieldDefaultSQL();
82                 String[] reqParameters = Globals.getRequestParams().split(",");
83                 String[] sessionParameters = Globals.getSessionParams().split(",");
84                 String[] scheduleSessionParameters = Globals.getSessionParamsForScheduling().split(",");
85                 javax.servlet.http.HttpSession session = request.getSession();
86                 String visible = nvl(fft.getVisible(),"Y");
87                 String dependsOn = nvl(fft.getDependsOn(), "");
88                 Calendar rangeStartDate = (fft.getRangeStartDate()==null)?null:fft.getRangeStartDate().toGregorianCalendar(); 
89                 Calendar rangeEndDate = (fft.getRangeEndDate()==null)?null:fft.getRangeEndDate().toGregorianCalendar(); 
90                                 //Calendar rangeEndDate = fft.getRangeEndDate().toGregorianCalendar(); 
91                                 String rangeStartDateSQL = fft.getRangeStartDateSQL(); 
92                                 String rangeEndDateSQL = fft.getRangeEndDateSQL(); 
93                                 String user_id = AppUtils.getUserID(request);
94                                 String multiSelectListSize = fft.getMultiSelectListSize();
95                                 
96                                 //s_logger.debug("ranges are : " + fft.getRangeStartDate() + fft.getRangeEndDate());
97                                 //s_logger.debug("fieldSQL B4" + fieldSQL);
98                 if(fieldSQL!=null) {
99                     for (int i = 0; i < reqParameters.length; i++) {
100                         if(!reqParameters[i].startsWith("ff") && (request.getParameter(reqParameters[i].toUpperCase())!=null && request.getParameter(reqParameters[i].toUpperCase()).length() > 0))
101                          fieldSQL = Utils.replaceInString(fieldSQL, "[" + reqParameters[i].toUpperCase()+"]", ESAPI.encoder().encodeForSQL( SecurityCodecUtil.getCodec(), request.getParameter(reqParameters[i].toUpperCase()) ));
102                         else if (request.getParameter(reqParameters[i])!=null && request.getParameter(reqParameters[i]).length() > 0)
103                          fieldSQL = Utils.replaceInString(fieldSQL, "[" + reqParameters[i].toUpperCase()+"]", ESAPI.encoder().encodeForSQL( SecurityCodecUtil.getCodec(), request.getParameter(reqParameters[i]) ));   
104                     }
105
106                         for (int i = 0; i < scheduleSessionParameters.length; i++) {
107                                 //s_logger.debug(" Session " + " scheduleSessionParameters[i] " + scheduleSessionParameters[i].toUpperCase() + " " + request.getParameter(scheduleSessionParameters[i]));
108                                 if(request.getParameter(scheduleSessionParameters[i])!=null && request.getParameter(scheduleSessionParameters[i]).trim().length()>0 )
109                                         fieldSQL = Utils.replaceInString(fieldSQL, "[" + scheduleSessionParameters[i].toUpperCase()+"]", ESAPI.encoder().encodeForSQL( SecurityCodecUtil.getCodec(), request.getParameter(scheduleSessionParameters[i]) ));
110                                 if(request.getAttribute(scheduleSessionParameters[i])!=null && ((String)request.getAttribute(scheduleSessionParameters[i])).trim().length()>0 )
111                                         fieldSQL = Utils.replaceInString(fieldSQL, "[" + scheduleSessionParameters[i].toUpperCase()+"]", ESAPI.encoder().encodeForSQL( SecurityCodecUtil.getCodec(), (String) request.getAttribute(scheduleSessionParameters[i]) ));
112
113                         }
114
115                     for (int i = 0; i < sessionParameters.length; i++) {
116                         //if(!sessionParameters[i].startsWith("ff"))
117                          //fieldSQL = Utils.replaceInString(fieldSQL, "[" + sessionParameters[i].toUpperCase()+"]", (String)session.getAttribute(sessionParameters[i].toUpperCase()) );
118                         //else {
119                         if (session.getAttribute(sessionParameters[i])!=null && ((String)session.getAttribute(sessionParameters[i])).length() > 0) {  
120                          //s_logger.debug(" Session " + " sessionParameters[i] " + sessionParameters[i] + " " + (String)session.getAttribute(sessionParameters[i]));
121                          fieldSQL = Utils.replaceInString(fieldSQL, "[" + sessionParameters[i].toUpperCase()+"]", (String)session.getAttribute(sessionParameters[i]) );
122                         }
123                        // }
124                     }
125                     fieldSQL = Utils.replaceInString(fieldSQL, "[USERID]", user_id);
126                     fieldSQL = Utils.replaceInString(fieldSQL, "[USER_ID]", user_id);
127                     fieldSQL = Utils.replaceInString(fieldSQL, "[LOGGED_USERID]", user_id);
128                     
129                 }
130
131                 if(fieldDefaultSQL!=null) {
132                     for (int i = 0; i < reqParameters.length; i++) {
133                         if(!reqParameters[i].startsWith("ff") && (request.getParameter(reqParameters[i].toUpperCase())!=null && request.getParameter(reqParameters[i].toUpperCase()).length() > 0))
134                          fieldDefaultSQL = Utils.replaceInString(fieldDefaultSQL, "[" + reqParameters[i].toUpperCase()+"]", ESAPI.encoder().encodeForSQL( SecurityCodecUtil.getCodec(), request.getParameter(reqParameters[i].toUpperCase()) ));
135                         else if (request.getParameter(reqParameters[i])!=null && request.getParameter(reqParameters[i]).length() > 0)
136                          fieldDefaultSQL = Utils.replaceInString(fieldDefaultSQL, "[" + reqParameters[i].toUpperCase()+"]", ESAPI.encoder().encodeForSQL( SecurityCodecUtil.getCodec(), request.getParameter(reqParameters[i]) ));   
137                     }
138                         for (int i = 0; i < scheduleSessionParameters.length; i++) {
139                                 //s_logger.debug(" Session " + " scheduleSessionParameters[i] " + scheduleSessionParameters[i].toUpperCase() + " " + request.getParameter(scheduleSessionParameters[i]));
140                                 if(request.getParameter(scheduleSessionParameters[i])!=null && request.getParameter(scheduleSessionParameters[i]).trim().length()>0 )
141                                         fieldDefaultSQL = Utils.replaceInString(fieldDefaultSQL, "[" + scheduleSessionParameters[i].toUpperCase()+"]", ESAPI.encoder().encodeForSQL( SecurityCodecUtil.getCodec(), request.getParameter(scheduleSessionParameters[i]) ));
142                                 if(request.getAttribute(scheduleSessionParameters[i])!=null && ((String)request.getAttribute(scheduleSessionParameters[i])).trim().length()>0 )
143                                         fieldDefaultSQL = Utils.replaceInString(fieldDefaultSQL, "[" + scheduleSessionParameters[i].toUpperCase()+"]", ESAPI.encoder().encodeForSQL( SecurityCodecUtil.getCodec(), (String) request.getAttribute(scheduleSessionParameters[i]) ));
144                                 
145                         }
146                     
147                     for (int i = 0; i < sessionParameters.length; i++) {
148                         //if(!sessionParameters[i].startsWith("ff"))
149                                 //fieldDefaultSQL = Utils.replaceInString(fieldDefaultSQL, "[" + sessionParameters[i].toUpperCase()+"]", (String)session.getAttribute(sessionParameters[i].toUpperCase()) );
150                         //else
151                         if (session.getAttribute(sessionParameters[i])!=null && ((String)session.getAttribute(sessionParameters[i])).length() > 0) 
152                                 fieldDefaultSQL = Utils.replaceInString(fieldDefaultSQL, "[" + sessionParameters[i].toUpperCase()+"]", (String)session.getAttribute(sessionParameters[i]) );   
153                     }
154                     
155                     fieldDefaultSQL = Utils.replaceInString(fieldDefaultSQL, "[USERID]", user_id);
156                     fieldDefaultSQL = Utils.replaceInString(fieldDefaultSQL, "[USER_ID]", user_id);
157                     fieldDefaultSQL = Utils.replaceInString(fieldDefaultSQL, "[LOGGED_USERID]", user_id);
158                 }
159                                 //s_logger.debug("fieldSQL After" + fieldSQL);
160                                 if(rangeStartDateSQL!=null) {
161                     for (int i = 0; i < reqParameters.length; i++) {
162                         if(!reqParameters[i].startsWith("ff") && (request.getParameter(reqParameters[i].toUpperCase())!=null && request.getParameter(reqParameters[i].toUpperCase()).length() > 0))
163                                 rangeStartDateSQL = Utils.replaceInString(rangeStartDateSQL, "[" + reqParameters[i].toUpperCase()+"]", ESAPI.encoder().encodeForSQL( SecurityCodecUtil.getCodec(), request.getParameter(reqParameters[i].toUpperCase()) ));
164                         else if (request.getParameter(reqParameters[i])!=null && request.getParameter(reqParameters[i]).length() > 0)
165                                 rangeStartDateSQL = Utils.replaceInString(rangeStartDateSQL, "[" + reqParameters[i].toUpperCase()+"]", ESAPI.encoder().encodeForSQL( SecurityCodecUtil.getCodec(), request.getParameter(reqParameters[i]) ));   
166                     }
167                     for (int i = 0; i < sessionParameters.length; i++) {
168                         if (session.getAttribute(sessionParameters[i])!=null && ((String)session.getAttribute(sessionParameters[i])).length() > 0)
169                         rangeStartDateSQL = Utils.replaceInString(rangeStartDateSQL, "[" + sessionParameters[i].toUpperCase()+"]", (String)session.getAttribute(sessionParameters[i]) );   
170                     }                         
171                 }
172                                 if(rangeEndDateSQL!=null) {
173                     for (int i = 0; i < reqParameters.length; i++) {
174                         if(!reqParameters[i].startsWith("ff")&& (request.getParameter(reqParameters[i].toUpperCase())!=null && request.getParameter(reqParameters[i].toUpperCase()).length() > 0))
175                                 rangeEndDateSQL = Utils.replaceInString(rangeEndDateSQL, "[" + reqParameters[i].toUpperCase()+"]", ESAPI.encoder().encodeForSQL( SecurityCodecUtil.getCodec(), request.getParameter(reqParameters[i].toUpperCase()) ));
176                         else if (request.getParameter(reqParameters[i])!=null && request.getParameter(reqParameters[i]).length() > 0)
177                                 rangeEndDateSQL = Utils.replaceInString(rangeEndDateSQL, "[" + reqParameters[i].toUpperCase()+"]", request.getParameter(reqParameters[i]) );   
178                     }
179                     for (int i = 0; i < sessionParameters.length; i++) {
180                         if (session.getAttribute(sessionParameters[i])!=null && ((String)session.getAttribute(sessionParameters[i])).length() > 0)
181                         rangeEndDateSQL = Utils.replaceInString(rangeEndDateSQL, "[" + sessionParameters[i].toUpperCase()+"]", ESAPI.encoder().encodeForSQL( SecurityCodecUtil.getCodec(), (String)session.getAttribute(sessionParameters[i]) ));   
182                     }                         
183                 }
184                                 String helpText = fft.getComment();
185
186                                 List predefinedValues = null;
187                                 if (fft.getPredefinedValueList() != null) {
188                                         predefinedValues = fft.getPredefinedValueList().getPredefinedValue();
189                                         if (predefinedValues.size() == 0)
190                                                 predefinedValues = null;
191                                 } // if
192
193                                 DataColumnType dct = rw.getColumnById(nvl(fft.getColId()));
194
195                                 boolean basedOnColumn = false;
196                                 if (rw.getReportDefType().equals(AppConstants.RD_SQL_BASED))
197                                         basedOnColumn = (nvl(fft.getColId()).indexOf('.') > 0);
198                                 else
199                                         basedOnColumn = (dct != null);
200
201                                 if (((!basedOnColumn) && (nvl(fieldSQL).length() == 0))
202                                                 || predefinedValues != null) {
203                                         if (predefinedValues != null)
204                                                 if (nvl(defaultValue).equals(AppConstants.FILTER_MAX_VALUE))
205                                                         defaultValue = (String) Collections.max(predefinedValues);
206                                                 else if (nvl(defaultValue).equals(AppConstants.FILTER_MIN_VALUE))
207                                                         defaultValue = (String) Collections.min(predefinedValues);
208                                         add(new FormField(fieldName, fieldDisplayName, fieldType, validationType,
209                                                         mandatory.equals("Y"), defaultValue, helpText, predefinedValues,visible.equals("Y"), dependsOn, rangeStartDate, rangeEndDate, rangeStartDateSQL, rangeEndDateSQL, multiSelectListSize));
210                                 } else if (nvl(fieldSQL).length() > 0) {
211                                         add(new FormField(fieldName, fieldDisplayName, fieldType, validationType,
212                                                         mandatory.equals("Y"), fieldDefaultSQL, helpText, fieldSQL,visible.equals("Y"), dependsOn, rangeStartDate, rangeEndDate, rangeStartDateSQL, rangeEndDateSQL, multiSelectListSize));
213                                 } else {
214                                         String lTableName = null;
215                                         String lColumnName = null;
216                                         String lColumnType = null;
217                                         String lColFormat = null;
218                                         if (rw.getReportDefType().equals(AppConstants.RD_SQL_BASED)) {
219                                                 String colId = nvl(fft.getColId());
220                                                 lTableName = ReportWrapper.getSQLBasedFFTColTableName(colId); // colId.substring(0,
221                                                                                                                                                                                 // colId.indexOf('.'));
222                                                 lColumnName = ReportWrapper.getSQLBasedFFTColColumnName(colId); // colId.substring(colId.lastIndexOf('.')+1);
223                                                 lColumnType = AppConstants.CT_CHAR;
224                                                 try {
225                                                         lColumnType = nvl(DataCache.getReportTableDbColumnType(lTableName,
226                                                                         lColumnName, rw.getDBInfo()), AppConstants.CT_CHAR);
227                                                 } catch (Exception e) {
228                                                 }
229                                                 lColFormat = lColumnType.equals(AppConstants.CT_DATE) ? nvl(
230                                                                 ReportWrapper.getSQLBasedFFTColDisplayFormat(colId),
231                                                                 AppConstants.DEFAULT_DATE_FORMAT) : "";
232                                         } else {
233                                                 lTableName = rw.getColumnTableById(dct.getColId()).getTableName(); // should
234                                                                                                                                                                                         // be
235                                                                                                                                                                                         // same
236                                                                                                                                                                                         // as
237                                                                                                                                                                                         // rw.getTableById(dct.getTableId()).getTableName()
238                                                 lColumnName = dct.getColName();
239                                                 lColumnType = dct.getColType();
240                                                 lColFormat = nvl(dct.getColFormat(), AppConstants.DEFAULT_DATE_FORMAT);
241                                         } // else
242
243                                         if (nvl(defaultValue).equals(AppConstants.FILTER_MAX_VALUE)
244                                                         || nvl(defaultValue).equals(AppConstants.FILTER_MIN_VALUE))
245                                                 try {
246                                                         String selectVal = (defaultValue
247                                                                         .equals(AppConstants.FILTER_MAX_VALUE) ? "MAX" : "MIN")
248                                                                         + "(" + lColumnName + ")";
249                                                         if (lColumnType.equals(AppConstants.CT_DATE))
250                                                                 selectVal = "TO_CHAR(" + selectVal + ", '"
251                                                                                 + AppConstants.DEFAULT_DATE_FORMAT + "')";
252                                                         // DataSet ds = DbUtils.executeQuery("SELECT
253                                                         // "+selectVal+" FROM "+lTableName);
254                                                         DataSet ds = ConnectionUtils.getDataSet("SELECT " + selectVal
255                                                                         + " FROM " + lTableName, rw.getDBInfo());
256                                                         if (ds.getRowCount() > 0)
257                                                                 defaultValue = ds.getString(0, 0);
258                                                 } catch (Exception e) {
259                                                 }
260
261                                         LookupDBInfo lookupDBInfo = DataCache.getLookupTable(lTableName,
262                                                         lColumnName);
263                                         String lookupTable = lookupDBInfo.getLookupTable();
264                                         String lookupIdField = lookupDBInfo.getLookupIdField();
265                                         String lookupNameField = lookupDBInfo.getLookupNameField();
266                                         String lookupSortByField = lookupDBInfo.getLookupNameField();
267                                         if (lColumnType.equals(AppConstants.CT_DATE)) {
268                                                 // Expects lookup on DATE fields will have both Id and
269                                                 // Name fields with DATE format; if not the case will
270                                                 // generate an error
271                                                 lookupIdField = "TO_CHAR(" + lookupIdField + ", '"
272                                                                 + AppConstants.DEFAULT_DATE_FORMAT + "')";
273                                                 lookupSortByField = " TO_DATE(TO_CHAR("+ lookupNameField +", '" + AppConstants.DEFAULT_DATE_FORMAT+ "'),'" + AppConstants.DEFAULT_DATE_FORMAT+ "') ";                        
274                                                 lookupNameField = "TO_CHAR(" + lookupNameField + ", '" + lColFormat
275                                                                 + "')";
276                                                 lookupSortByField += " DESC";
277                                         } // if
278                     if (fieldDefaultSQL!=null && fieldDefaultSQL.length()>0 && (fieldDefaultSQL.trim().length()>10) && fieldDefaultSQL.substring(0,10).toLowerCase().startsWith("select")) {
279                      add(new FormField(fieldName, fieldDisplayName, fieldType, validationType,
280                             mandatory.equals("Y"), fieldDefaultSQL, helpText, lookupTable,
281                             lookupIdField, lookupNameField, lookupSortByField,visible.equals("Y"),dependsOn, rangeStartDate, rangeEndDate, rangeStartDateSQL, rangeEndDateSQL, multiSelectListSize));
282                         
283                     } else {
284                                          add(new FormField(fieldName, fieldDisplayName, fieldType, validationType,
285                                                         mandatory.equals("Y"), defaultValue, helpText, lookupTable,
286                                                         lookupIdField, lookupNameField, lookupSortByField,visible.equals("Y"), dependsOn, rangeStartDate, rangeEndDate, rangeStartDateSQL, rangeEndDateSQL, multiSelectListSize));
287                     }
288                                 } // else
289                         } // for
290
291                 List reportCols = rw.getAllColumns();
292                 for (Iterator iter = reportCols.iterator(); iter.hasNext();) {
293                         DataColumnType dct = (DataColumnType) iter.next();
294
295                         if (dct.getColFilterList() != null) {
296                                 int fNo = 0;
297                                 List fList = dct.getColFilterList().getColFilter();
298                                 for (Iterator iterF = fList.iterator(); iterF.hasNext(); fNo++) {
299                                         ColFilterType cft = (ColFilterType) iterF.next();
300
301                                         if (nvl(cft.getArgType()).equals(AppConstants.AT_FORM)
302                                                         && rw.getFormFieldByDisplayValue(cft.getArgValue()) == null) {
303                                                 String fieldName = rw.getFormFieldName(cft);
304                                                 String fieldDisplayName = rw.getFormFieldDisplayName(dct, cft);
305
306                                                 LookupDBInfo lookupDBInfo = DataCache.getLookupTable(rw
307                                                                 .getColumnTableById(dct.getColId()).getTableName(), dct
308                                                                 .getColName());
309                                                 String lookupTable = lookupDBInfo.getLookupTable();
310                                                 String lookupIdField = lookupDBInfo.getLookupIdField();
311                                                 String lookupNameField = lookupDBInfo.getLookupNameField();
312                                                 String lookupSortByField = lookupDBInfo.getLookupNameField();
313                                                 Calendar lookupRangeStartDate = rw.getFormFieldRangeStart(cft); 
314                                                 Calendar lookupRangeEndDate = rw.getFormFieldRangeEnd(cft); 
315                                                 String lookupRangeStartDateSQL = rw.getFormFieldRangeStartSQL(cft); 
316                                                 String lookupRangeEndDateSQL = rw.getFormFieldRangeEndSQL(cft); 
317                                                 if (dct.getColType().equals(AppConstants.CT_DATE)) {
318                                                         // Expects lookup on DATE fields will have both Id
319                                                         // and Name fields with DATE format; if not the case
320                                                         // will generate an error
321                                                         lookupIdField = "TO_CHAR("
322                                                                         + lookupIdField
323                                                                         + ", '"
324                                                                         + nvl(dct.getColFormat(), AppConstants.DEFAULT_DATE_FORMAT)
325                                                                         + "')";
326                                                         lookupNameField = "TO_CHAR("
327                                                                         + lookupNameField
328                                                                         + ", '"
329                                                                         + nvl(dct.getColFormat(), AppConstants.DEFAULT_DATE_FORMAT)
330                                                                         + "')";
331                                                         lookupSortByField += " DESC";
332                                                 } // if
333                                                 add(new FormField(fieldName, fieldDisplayName,
334                                                                 FormField.FFT_TEXT_W_POPUP, null, false, null, null,
335                                                                 lookupTable, lookupIdField, lookupNameField, lookupSortByField,null, lookupRangeStartDate, lookupRangeEndDate, lookupRangeStartDateSQL, lookupRangeEndDateSQL, "0"));
336                                         } // if
337                                 } // for
338                         } // if
339                 } // for
340         } // ReportFormFields
341
342         public int getFieldCount() {
343                 return size();
344         } // getFieldCount
345
346         public FormField getFormField(int fieldIdx) {
347                 return (FormField) get(fieldIdx);
348         } // getFormField
349
350         public FormField getFormField(String fieldName) {
351                 for (int i = 0; i < getFieldCount(); i++) {
352                         FormField ff = (FormField) get(i);
353                         if (ff.getFieldName().equals(fieldName))
354                                 return ff;
355                 } // for
356
357                 return null;
358         } // getFormField
359
360         public void resetNext() {
361                 resetNext(0);
362         } // resetNext
363
364         public void resetNext(int toPos) {
365                 nextElemIdx = toPos;
366         } // resetNext
367
368         public boolean hasNext() {
369                 return (nextElemIdx < size());
370         } // hasNext
371
372         public FormField getNext() {
373                 return hasNext() ? getFormField(nextElemIdx++) : null;
374         } // getNext
375
376         /** ************************************************************************************************* */
377
378         private String nvl(String s) {
379                 return (s == null) ? "" : s;
380         }
381
382         private String nvl(String s, String sDefault) {
383                 return nvl(s).equals("") ? sDefault : s;
384         }
385
386 } // ReportFormFields