001 package ca.uhn.hl7v2.conf.spec.message; 002 003 import ca.uhn.hl7v2.conf.ProfileException; 004 005 /** 006 * The specification for a specific field in a message profile. 007 * @author Bryan Tripp 008 */ 009 public class Field extends AbstractComponent { 010 011 /** Utility field used by bound properties. */ 012 private java.beans.PropertyChangeSupport propertyChangeSupport = new java.beans.PropertyChangeSupport(this); 013 014 /** Utility field used by constrained properties. */ 015 private java.beans.VetoableChangeSupport vetoableChangeSupport = new java.beans.VetoableChangeSupport(this); 016 017 private short min; 018 private short max; 019 private short itemNo; 020 021 private Component[] components; 022 023 /** Creates a new instance of Field */ 024 public Field() { 025 this.components = new Component[0]; 026 } 027 028 /** Adds a PropertyChangeListener to the listener list. 029 * @param l The listener to add. 030 */ 031 public void addPropertyChangeListener(java.beans.PropertyChangeListener l) { 032 propertyChangeSupport.addPropertyChangeListener(l); 033 } 034 035 /** Removes a PropertyChangeListener from the listener list. 036 * @param l The listener to remove. 037 */ 038 public void removePropertyChangeListener(java.beans.PropertyChangeListener l) { 039 propertyChangeSupport.removePropertyChangeListener(l); 040 } 041 042 /** Adds a VetoableChangeListener to the listener list. 043 * @param l The listener to add. 044 */ 045 public void addVetoableChangeListener(java.beans.VetoableChangeListener l) { 046 vetoableChangeSupport.addVetoableChangeListener(l); 047 } 048 049 /** Removes a VetoableChangeListener from the listener list. 050 * @param l The listener to remove. 051 */ 052 public void removeVetoableChangeListener(java.beans.VetoableChangeListener l) { 053 vetoableChangeSupport.removeVetoableChangeListener(l); 054 } 055 056 /** Getter for property min. 057 * @return Value of property min. 058 */ 059 public short getMin() { 060 return this.min; 061 } 062 063 /** Setter for property min. 064 * @param min New value of property min. 065 * 066 * @throws ProfileException 067 */ 068 public void setMin(short min) throws ProfileException { 069 short oldMin = this.min; 070 try { 071 vetoableChangeSupport.fireVetoableChange("min", new Short(oldMin), new Short(min)); 072 } catch (Exception e) { 073 throw new ProfileException(null, e); 074 } 075 this.min = min; 076 propertyChangeSupport.firePropertyChange("min", new Short(oldMin), new Short(min)); 077 } 078 079 /** Getter for property max. 080 * @return Value of property max. 081 */ 082 public short getMax() { 083 return this.max; 084 } 085 086 /** Setter for property max. 087 * @param max New value of property max. 088 * 089 * @throws ProfileException 090 */ 091 public void setMax(short max) throws ProfileException { 092 short oldMax = this.max; 093 try { 094 vetoableChangeSupport.fireVetoableChange("max", new Short(oldMax), new Short(max)); 095 } catch (Exception e) { 096 throw new ProfileException(null, e); 097 } 098 this.max = max; 099 propertyChangeSupport.firePropertyChange("max", new Short(oldMax), new Short(max)); 100 } 101 102 /** Getter for property itemNo. 103 * @return Value of property itemNo. 104 */ 105 public short getItemNo() { 106 return this.itemNo; 107 } 108 109 /** Setter for property itemNo. 110 * @param itemNo New value of property itemNo. 111 * 112 * @throws ProfileException 113 */ 114 public void setItemNo(short itemNo) throws ProfileException { 115 short oldItemNo = this.itemNo; 116 try { 117 vetoableChangeSupport.fireVetoableChange("itemNo", new Short(oldItemNo), new Short(itemNo)); 118 } catch (Exception e) { 119 throw new ProfileException(null, e); 120 } 121 this.itemNo = itemNo; 122 propertyChangeSupport.firePropertyChange("itemNo", new Short(oldItemNo), new Short(itemNo)); 123 } 124 125 /** Indexed getter for property components (index starts at 1 following HL7 convention). 126 * @param index Index of the property (starts at 1 following HL7 convention). 127 * @return Value of the property at <CODE>index</CODE>. 128 */ 129 public Component getComponent(int index) { 130 return this.components[index - 1]; 131 } 132 133 /** Indexed setter for property components (index starts at 1 following HL7 convention). 134 * @param index Index of the property (starts at 1 following HL7 convention). 135 * @param component New value of the property at <CODE>index</CODE>. 136 * 137 * @throws ProfileException 138 */ 139 public void setComponent(int index, Component component) throws ProfileException { 140 index--; 141 extendChildList(index); 142 Component oldComponent = this.components[index]; 143 this.components[index] = component; 144 try { 145 vetoableChangeSupport.fireVetoableChange("components", null, null ); 146 } 147 catch(java.beans.PropertyVetoException vetoException ) { 148 this.components[index] = oldComponent; 149 throw new ProfileException(null, vetoException); 150 } 151 propertyChangeSupport.firePropertyChange("components", null, null ); 152 } 153 154 /** Makes child list long enough to accommodate setter. */ 155 private void extendChildList(int index) { 156 if (index >= this.components.length) { 157 Component[] newCopy = new Component[index + 1]; 158 System.arraycopy(this.components, 0, newCopy, 0, this.components.length); 159 this.components = newCopy; 160 } 161 } 162 163 /** Returns the number of components */ 164 public int getComponents() { 165 return this.components.length; 166 } 167 168 } 169 170