001 package ca.uhn.hl7v2.conf.spec.message; 002 003 import ca.uhn.hl7v2.conf.ProfileException; 004 005 /** 006 * An abstraction of SegGroup and MessageProfile (both are containers for segment specs). 007 * @author Bryan Tripp 008 */ 009 public class AbstractSegmentContainer { 010 011 private String description; 012 private String reference; 013 private String impNote; 014 private ProfileStructure[] children; 015 016 /** Utility field used by bound properties. */ 017 private java.beans.PropertyChangeSupport propertyChangeSupport = new java.beans.PropertyChangeSupport(this); 018 019 /** Utility field used by constrained properties. */ 020 private java.beans.VetoableChangeSupport vetoableChangeSupport = new java.beans.VetoableChangeSupport(this); 021 022 /** Creates a new instance of AbstractSegmentContainer */ 023 public AbstractSegmentContainer() { 024 children = new ProfileStructure[0]; 025 } 026 027 /** Adds a PropertyChangeListener to the listener list. 028 * @param l The listener to add. 029 */ 030 public void addPropertyChangeListener(java.beans.PropertyChangeListener l) { 031 propertyChangeSupport.addPropertyChangeListener(l); 032 } 033 034 /** Removes a PropertyChangeListener from the listener list. 035 * @param l The listener to remove. 036 */ 037 public void removePropertyChangeListener(java.beans.PropertyChangeListener l) { 038 propertyChangeSupport.removePropertyChangeListener(l); 039 } 040 041 /** Adds a VetoableChangeListener to the listener list. 042 * @param l The listener to add. 043 */ 044 public void addVetoableChangeListener(java.beans.VetoableChangeListener l) { 045 vetoableChangeSupport.addVetoableChangeListener(l); 046 } 047 048 /** Removes a VetoableChangeListener from the listener list. 049 * @param l The listener to remove. 050 */ 051 public void removeVetoableChangeListener(java.beans.VetoableChangeListener l) { 052 vetoableChangeSupport.removeVetoableChangeListener(l); 053 } 054 055 /** Getter for property description. 056 * @return Value of property description. 057 */ 058 public String getDescription() { 059 return this.description; 060 } 061 062 /** Setter for property description. 063 * @param description New value of property description. 064 * 065 * @throws ProfileException 066 */ 067 public void setDescription(String description) throws ProfileException { 068 String oldDescription = this.description; 069 try { 070 vetoableChangeSupport.fireVetoableChange("description", oldDescription, description); 071 } catch (Exception e) { 072 throw new ProfileException(null, e); 073 } 074 this.description = description; 075 propertyChangeSupport.firePropertyChange("description", oldDescription, description); 076 } 077 078 /** Getter for property reference. 079 * @return Value of property reference. 080 */ 081 public String getReference() { 082 return this.reference; 083 } 084 085 /** Setter for property reference. 086 * @param reference New value of property reference. 087 * 088 * @throws ProfileException 089 */ 090 public void setReference(String reference) throws ProfileException { 091 String oldReference = this.reference; 092 try { 093 vetoableChangeSupport.fireVetoableChange("reference", oldReference, reference); 094 } catch (Exception e) { 095 throw new ProfileException(null, e); 096 } 097 this.reference = reference; 098 propertyChangeSupport.firePropertyChange("reference", oldReference, reference); 099 } 100 101 /** Getter for property impNote. 102 * @return Value of property impNote. 103 */ 104 public String getImpNote() { 105 return this.impNote; 106 } 107 108 /** Setter for property impNote. 109 * @param impNote New value of property impNote. 110 * 111 * @throws ProfileException 112 */ 113 public void setImpNote(String impNote) throws ProfileException { 114 String oldImpNote = this.impNote; 115 try { 116 vetoableChangeSupport.fireVetoableChange("impNote", oldImpNote, impNote); 117 } catch (Exception e) { 118 throw new ProfileException(null, e); 119 } 120 this.impNote = impNote; 121 propertyChangeSupport.firePropertyChange("impNote", oldImpNote, impNote); 122 } 123 124 125 /** Indexed getter for property structure (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 ProfileStructure getChild(int index) { 130 return this.children[index - 1]; 131 } 132 133 /** Indexed setter for property structure. Lengthens child list if necessary. 134 * @param index Index of the property (starts at 1 following HL7 convention). 135 * @param structure New value of the property at <CODE>index</CODE>. 136 * 137 * @throws ProfileException 138 */ 139 public void setChild(int index, ProfileStructure structure) throws ProfileException { 140 index--; 141 extendChildList(index); 142 ProfileStructure oldStructure = this.children[index]; 143 this.children[index] = structure; 144 try { 145 vetoableChangeSupport.fireVetoableChange("structure", null, null ); 146 } 147 catch(java.beans.PropertyVetoException vetoException ) { 148 this.children[index] = oldStructure; 149 throw new ProfileException(null, vetoException); 150 } 151 propertyChangeSupport.firePropertyChange("structure", null, null ); 152 } 153 154 /** Returns the number of children */ 155 public int getChildren() { 156 return this.children.length; 157 } 158 159 /** Makes child list long enough to accommodate setter. */ 160 private void extendChildList(int index) { 161 if (index >= this.children.length) { 162 ProfileStructure[] newCopy = new ProfileStructure[index + 1]; 163 System.arraycopy(this.children, 0, newCopy, 0, this.children.length); 164 this.children = newCopy; 165 } 166 } 167 168 }