/**
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations under
* the License.
*
* The Original Code is OpenELIS code.
*
* Copyright (C) The Minnesota Department of Health. All Rights Reserved.
*/
package us.mn.state.health.lims.testanalyte.form;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import org.apache.commons.beanutils.ConversionException;
import us.mn.state.health.lims.common.action.BaseActionForm;
import us.mn.state.health.lims.common.log.LogEvent;
//We have some dynamically (through javascript) created collections that need to be initialized
public class TestAnalyteTestResultActionForm extends BaseActionForm {
private Hashtable tableOfLists;// dynamic, nested and indexed property
private ArrayList aList;
public TestAnalyteTestResultActionForm() {
tableOfLists = new Hashtable();
tableOfLists.put("selectedAnalyteIds", new ArrayList());
tableOfLists.put("selectedAnalyteNames", new ArrayList());
tableOfLists.put("selectedAnalyteTypes", new ArrayList());
//bugzilla 1870
tableOfLists.put("selectedAnalyteIsReportables", new ArrayList());
tableOfLists.put("selectedAnalyteResultGroups", new ArrayList());
tableOfLists.put("selectedTestAnalyteIds", new ArrayList());
tableOfLists.put("testAnalyteLastupdatedList", new ArrayList());
tableOfLists.put("testResultValueList", new ArrayList());
tableOfLists.put("testResultResultGroups", new ArrayList());
tableOfLists.put("testResultResultGroupTypes", new ArrayList());
tableOfLists.put("dictionaryEntryIdList", new ArrayList());
tableOfLists.put("flagsList", new ArrayList());
//bugzilla 1845 added testResult sortOrder
tableOfLists.put("sortList", new ArrayList());
tableOfLists.put("significantDigitsList", new ArrayList());
tableOfLists.put("quantLimitList", new ArrayList());
tableOfLists.put("testResultIdList", new ArrayList());
tableOfLists.put("testResultLastupdatedList", new ArrayList());
}
private void increaseSize(List l, int index) {
//System.out.println("I am in increaseSize(List l, int index)");
while (l.size() < index + 1) {
l.add("");
}
}
public Object getAList(String name, int index) {
//System.out.println("I am in getAList(String name, int index)");
aList = (ArrayList) tableOfLists.get(name);
while (index >= aList.size()) {
aList.add("");
}
tableOfLists.put(name, aList);
return (String) aList.get(index);
}
// Setter Method
public void setAList(String name, int index, Object object) {
//System.out
//.println("I am in setAList(String name, int index, Object object) with "
//+ name + " " + index + " " + object);
aList = (ArrayList) tableOfLists.get(name);
if (index < aList.size()) {
aList.set(index, object);
} else {
increaseSize(aList, index);
aList.set(index, object);
}
tableOfLists.put(name, aList);
// System.out.println("setAList setting " + name + aList.size());
set(name, aList);
}
/**
* <p>
* Return the value of an indexed property with the specified name.
* </p>
*
* @param name
* Name of the property whose value is to be retrieved
* @param index
* Index of the value to be retrieved
*
* @exception IllegalArgumentException
* if there is no property of the specified name
* @exception IllegalArgumentException
* if the specified property exists, but is not indexed
* @exception IndexOutOfBoundsException
* if the specified index is outside the range of the
* underlying property
* @exception NullPointerException
* if no array or List has been initialized for this property
*/
public Object get(String name, int index) {
//System.out.println("I am in get(String name, int index)");
Object value = dynaValues.get(name);
if (value == null) {
throw new NullPointerException("No indexed value for '" + name
+ "[" + index + "]'");
} else if (value.getClass().isArray()) {
return (Array.get(value, index));
} else if (value instanceof List) {
Object o = null;
// here is override!!!!!
o = getAList(name, index);
return o;
} else {
throw new IllegalArgumentException("Non-indexed property for '"
+ name + "[" + index + "]'");
}
}
/**
* <p>
* Set the value of an indexed property with the specified name.
* </p>
*
* @param name
* Name of the property whose value is to be set
* @param index
* Index of the property to be set
* @param value
* Value to which this property is to be set
*
* @exception ConversionException
* if the specified value cannot be converted to the type
* required for this property
* @exception IllegalArgumentException
* if there is no property of the specified name
* @exception IllegalArgumentException
* if the specified property exists, but is not indexed
* @exception IndexOutOfBoundsException
* if the specified index is outside the range of the
* underlying property
*/
public void set(String name, int index, Object value) {
//System.out
//.println("I am in set(String name, int index, Object value) with "
//+ name + " " + index + " " + value);
Object prop = dynaValues.get(name);
if (prop == null) {
throw new NullPointerException("No indexed value for '" + name
+ "[" + index + "]'");
} else if (prop.getClass().isArray()) {
Array.set(prop, index, value);
} else if (prop instanceof List) {
try {
setAList(name, index, value);
} catch (ClassCastException e) {
//bugzilla 2154
LogEvent.logError("TestAnalyteTestResultActionForm","set()",e.getMessage());
throw new ConversionException(e.getMessage());
}
} else {
throw new IllegalArgumentException("Non-indexed property for '"
+ name + "[" + index + "]'");
}
}
/**
* Reset all properties to their default values.
*
* @param mapping
* The mapping used to select this instance
* @param request
* The servlet request we are processing
*/
public void resetLists() {
//System.out.println("I am in resetLists()");
tableOfLists = new Hashtable();
tableOfLists.put("selectedAnalyteIds", new ArrayList());
tableOfLists.put("selectedAnalyteNames", new ArrayList());
tableOfLists.put("selectedAnalyteTypes", new ArrayList());
//bugzilla 1870
tableOfLists.put("selectedAnalyteIsReportables", new ArrayList());
tableOfLists.put("selectedAnalyteResultGroups", new ArrayList());
tableOfLists.put("selectedTestAnalyteIds", new ArrayList());
tableOfLists.put("testAnalyteLastupdatedList", new ArrayList());
tableOfLists.put("testResultValueList", new ArrayList());
tableOfLists.put("testResultResultGroups", new ArrayList());
tableOfLists.put("testResultResultGroupTypes", new ArrayList());
tableOfLists.put("dictionaryEntryIdList", new ArrayList());
tableOfLists.put("flagsList", new ArrayList());
//bugzilla 1845 added testResult sortOrder
tableOfLists.put("sortList", new ArrayList());
tableOfLists.put("significantDigitsList", new ArrayList());
tableOfLists.put("quantLimitList", new ArrayList());
tableOfLists.put("testResultIdList", new ArrayList());
tableOfLists.put("testResultLastupdatedList", new ArrayList());
}
/**
* <p>
* Return the value of a simple property with the specified name.
* </p>
*
* @param name
* Name of the property whose value is to be retrieved
*
* @exception IllegalArgumentException
* if there is no property of the specified name
* @exception NullPointerException
* if the type specified for the property is invalid
*/
public Object get(String name) {
// Return any non-null value for the specified property
Object value = dynaValues.get(name);
//System.out.println("I am in get(String name) " + name + " " + value);
if (value != null) {
return (value);
}
// Return a null value for a non-primitive property
Class type = getDynaProperty(name).getType();
if (type == null) {
throw new NullPointerException("The type for property " + name
+ " is invalid");
}
if (!type.isPrimitive()) {
return (value);
}
// Manufacture default values for primitive properties
if (type == Boolean.TYPE) {
return (Boolean.FALSE);
} else if (type == Byte.TYPE) {
return (new Byte((byte) 0));
} else if (type == Character.TYPE) {
return (new Character((char) 0));
} else if (type == Double.TYPE) {
return (new Double(0.0));
} else if (type == Float.TYPE) {
return (new Float((float) 0.0));
} else if (type == Integer.TYPE) {
return (new Integer(0));
} else if (type == Long.TYPE) {
return (new Long(0));
} else if (type == Short.TYPE) {
return (new Short((short) 0));
} else {
return (null);
}
}
}