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