/* * WOAnyField.java * [JavaWOExtensions Project] */ package com.webobjects.woextensions; import java.text.ParseException; import com.webobjects.appserver.WOComponent; import com.webobjects.appserver.WOContext; import com.webobjects.appserver.WODisplayGroup; import com.webobjects.eoaccess.EOAttribute; import com.webobjects.eoaccess.EOEntity; import com.webobjects.eoaccess.EOModelGroup; import com.webobjects.eoaccess.EORelationship; import com.webobjects.foundation.NSLog; import com.webobjects.foundation.NSNumberFormatter; import com.webobjects.foundation.NSTimestampFormatter; public class WOAnyField extends WOComponent { /** * Do I need to update serialVersionUID? * See section 5.6 <cite>Type Changes Affecting Serialization</cite> on page 51 of the * <a href="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf">Java Object Serialization Spec</a> */ private static final long serialVersionUID = 1L; protected static final String DEFAULT_DATE_FORMAT = "YYYY/MM/DD"; protected static final String DEFAULT_NUMBER_FORMAT = "0"; private String _relationshipKey; private String _selectedKey; private String _selectedOperator; private Object _value; private String _textFieldValue; private WODisplayGroup _displayGroup; // ivars for PopUp public String selectedKeyItem; public String selectedOperatorItem; public WOAnyField(WOContext aContext) { super(aContext); } public String selectedOperatorItem() { return selectedOperatorItem; } public void setSelectedOperatorItem(String aSelectedOperatorItem) { selectedOperatorItem = aSelectedOperatorItem; } public String selectedKeyItem() { return selectedKeyItem; } public void setSelectedKeyItem(String aSelectedKeyItem) { setValueForBinding(aSelectedKeyItem, "key"); selectedKeyItem = aSelectedKeyItem; } @Override public boolean isStateless() { return true; } public String relationshipKey() { if (_relationshipKey == null) { _relationshipKey = (String) _WOJExtensionsUtil.valueForBindingOrNull("relationshipKey", this); } return _relationshipKey; } public String selectedKey() { if (_selectedKey == null) { _selectedKey = (String) _WOJExtensionsUtil.valueForBindingOrNull("selectedKey", this); } return _selectedKey; } public void setSelectedKey(String key) { _selectedKey = key; } public String valueClassNameForKey(String key) { String entityName = (String) _WOJExtensionsUtil.valueForBindingOrNull("sourceEntityName", this); EOModelGroup modelGroup = EOModelGroup.defaultGroup(); EOEntity entity = modelGroup.entityNamed(entityName); EOAttribute selectedAttribute = null; if (relationshipKey() != null && entity.relationshipNamed(relationshipKey()) != null) { EORelationship relationship = entity.relationshipNamed(relationshipKey()); EOEntity destinationEntity = relationship.destinationEntity(); selectedAttribute = destinationEntity.attributeNamed(key); } else { selectedAttribute = entity.attributeNamed(key); } return selectedAttribute.className(); } public String formatterForKey(String key) { String formatter = null; if (hasBinding("formatter")) { setValueForBinding(key, "key"); formatter = (String) _WOJExtensionsUtil.valueForBindingOrNull("formatter", this); } if (formatter == null) { String className = valueClassNameForKey(key); if (className.equals("com.webobjects.foundation.NSTimestamp")) { formatter = DEFAULT_DATE_FORMAT; } else if (className.equals("java.lang.Number") || className.equals("java.math.BigDecimal")) { formatter = DEFAULT_NUMBER_FORMAT; } } return formatter; } public WODisplayGroup displayGroup() { if (_displayGroup == null) { _displayGroup = (WODisplayGroup) _WOJExtensionsUtil.valueForBindingOrNull("displayGroup", this); } return _displayGroup; } public String selectedOperator() { return _selectedOperator; } public void setSelectedOperator(String anOperator) { _selectedOperator = (anOperator.equals("=")) ? "": anOperator; } public Object value() { if (_value == null) { _value = _WOJExtensionsUtil.valueForBindingOrNull("value", this); } return _value; } public void setValue(Object newValue) { _value = newValue; WODisplayGroup displayGroup = displayGroup(); if (displayGroup != null) { displayGroup.queryMatch().removeAllObjects(); if (relationshipKey() != null) { displayGroup.queryMatch().takeValueForKey(newValue, relationshipKey() + "." + selectedKey()); if (newValue != null) { displayGroup.queryOperator().takeValueForKey(selectedOperator(), relationshipKey() + "." + selectedKey()); } } else { displayGroup.queryMatch().takeValueForKey(newValue, selectedKey()); if (newValue != null) { displayGroup.queryOperator().takeValueForKey(selectedOperator(), selectedKey()); } } } } public String textFieldValue() { if (_textFieldValue != null) { return _textFieldValue; } Object value = value(); setValue(value); if (value == null) { return null; } else if (value instanceof String) { return (String) value; } else { java.text.Format formatter = null; String className = valueClassNameForKey(selectedKey()); if (className.equals("com.webobjects.foundation.NSTimestamp")) { String dateFormatterString = formatterForKey(selectedKey()); formatter = new NSTimestampFormatter(dateFormatterString); } else if (className.equals("java.lang.Number") || className.equals("java.math.BigDecimal")) { String numberFormatterString = formatterForKey(selectedKey()); formatter = new NSNumberFormatter(numberFormatterString); } return (formatter != null) ? formatter.format(value) : value.toString(); } } public void setTextFieldValue(String value) { String className = valueClassNameForKey(selectedKey()); if (className.equals("com.webobjects.foundation.NSTimestamp")) { String dateFormatterString = formatterForKey(selectedKey()); NSTimestampFormatter dateFormatter = new NSTimestampFormatter(dateFormatterString); Object objectValue = null; try { objectValue = dateFormatter.parseObject((value != null) ? value.toString() : ""); } catch (ParseException e) { if (NSLog.debugLoggingAllowedForLevelAndGroups(NSLog.DebugLevelDetailed, NSLog.DebugGroupWebObjects)) { NSLog.debug.appendln(e); } } setValue(objectValue); } else if (className.equals("java.lang.Number") || className.equals("java.math.BigDecimal")) { String numberFormatterString = formatterForKey(selectedKey()); NSNumberFormatter numberFormatter = new NSNumberFormatter(numberFormatterString); Object objectValue = null; try { objectValue = numberFormatter.parseObject((value != null) ? value.toString() : ""); } catch (ParseException e) { if (NSLog.debugLoggingAllowedForLevelAndGroups(NSLog.DebugLevelDetailed, NSLog.DebugGroupWebObjects)) { NSLog.debug.appendln(e); } } setValue(objectValue); } else { // Assume String setValue(value); } } public void invalidateCaches() { // In order for this to behave like an element, all instance // variables need to be flushed before this components is used again // so that it will pull via association. _relationshipKey = null; _selectedKey = null; _selectedOperator = null; _value = null; _textFieldValue = null; _displayGroup = null; } @Override public void finalize() throws Throwable { super.finalize(); invalidateCaches(); } @Override public void reset() { invalidateCaches(); } }