001package ca.uhn.hl7v2.conf.spec.message;
002
003import ca.uhn.hl7v2.conf.ProfileException;
004
005/**
006 * The specification for a particular field component in a message profile.  
007 * @author Bryan Tripp
008 */
009public class Component extends AbstractComponent {
010
011    private SubComponent[] components;
012
013    /** Creates a new instance of Component */
014    public Component() {
015        components = new SubComponent[0];
016    }
017    
018    /** Indexed getter for property components (index starts at 1 following HL7 convention).
019     * @param index Index of the property (starts at 1 following HL7 convention).
020     * @return Value of the property at <CODE>index</CODE>.
021     */
022    public SubComponent getSubComponent(int index) {
023        return this.components[index - 1];
024    }
025    
026    /** Indexed setter for property components (index starts at 1 following HL7 convention).
027     * @param index Index of the property (starts at 1 following HL7 convention).
028     * @param component New value of the property at <CODE>index</CODE>.
029     *
030     * @throws ProfileException
031     */
032    public void setSubComponent(int index, SubComponent component) throws ProfileException {
033        index--;
034        extendChildList(index);
035        SubComponent oldComponent = this.components[index];
036        this.components[index] = component;
037        try {
038            vetoableChangeSupport.fireVetoableChange("components", null, null );
039        }
040        catch(java.beans.PropertyVetoException vetoException ) {
041            this.components[index] = oldComponent;
042            throw new ProfileException(null, vetoException);
043        }
044        propertyChangeSupport.firePropertyChange("components", null, null );
045    }    
046
047    /** Makes child list long enough to accommodate setter.  */
048    private void extendChildList(int index) {
049        if (index >= this.components.length) {
050            SubComponent[] newCopy = new SubComponent[index + 1];
051            System.arraycopy(this.components, 0, newCopy, 0, this.components.length);
052            this.components = newCopy;
053        }        
054    }        
055
056    /** Returns the number of subcomponents in this component */
057    public int getSubComponents() {
058        return this.components.length;
059    }
060    
061}