private void populateFully(Group theA01) throws HL7Exception {
    for (String nextName : theA01.getNames()) {
      if (nextName.equals("MSH")) {
        continue;
      }

      Structure nextStruct = theA01.get(nextName);
      if (nextStruct instanceof Segment) {
        Segment seg = (Segment) nextStruct;
        for (int i = 1; i <= seg.numFields(); i++) {
          populateFully(seg.getField(i, 0));
        }
      } else {
        populateFully((Group) nextStruct);
      }
    }
  }
 /**
  * Checks a segment against a list of allowed fields (ie those mentioned in the profile with usage
  * other than X). Returns a list of exceptions representing field that appear but are not supposed
  * to.
  *
  * @param allowedFields an array of Integers containing field #s of allowed fields
  */
 protected List<ValidationException> checkForExtraFields(
     Segment segment, List<Integer> allowedFields) {
   ArrayList<ValidationException> exList = new ArrayList<>();
   for (int i = 1; i <= segment.numFields(); i++) {
     if (!allowedFields.contains(new Integer(i))) {
       try {
         Type[] reps = segment.getField(i);
         for (Type rep : reps) {
           profileViolatedWhen(
               !isEmpty(rep), exList, FIELD_NOT_DEFINED_IN_PROFILE, i, segment.getName());
         }
       } catch (HL7Exception he) {
         exList.add(
             new ValidationException("Problem testing against profile: " + he.getMessage()));
       }
     }
   }
   return exList;
 }
  protected List<ValidationException> testSegment(Segment segment, SegmentType profile) {
    List<ValidationException> exList = new ArrayList<>();
    List<Integer> allowedFields = new ArrayList<>();
    int i = 1;
    for (SegmentType.Field field : profile.getFields()) {
      UsageInfo usage = new UsageInfo(field);
      // only test a field in detail if it isn't X
      if (!usage.disallowed()) {
        allowedFields.add(i);

        // see which instances have content
        try {
          Collection<Type> nonEmptyFields = nonEmptyField(segment.getField(i));
          exList.addAll(testCardinality(nonEmptyFields.size(), usage));

          // test field instances with content
          if (validateChildren) {
            for (Type type : nonEmptyFields) {
              boolean escape = true; // escape field value when checking length
              if (profile.getName().equalsIgnoreCase("MSH") && i < 3) {
                escape = false;
              }
              List<ValidationException> childExceptions = testField(type, field, escape);
              for (ValidationException ex : childExceptions) {
                ex.setFieldPosition(i);
              }
              exList.addAll(childExceptions);
            }
          }
        } catch (HL7Exception he) {
          profileNotHL7Compliant(exList, FIELD_NOT_FOUND, i);
        }
      }
      ++i;
    }
    // complain about X fields with content
    exList.addAll(checkForExtraFields(segment, allowedFields));

    for (ValidationException ex : exList) {
      ex.setSegmentName(profile.getName());
    }
    return exList;
  }
 /** {@inheritDoc} */
 @Override
 public int hashCode() {
   return mySegment.hashCode() + myComponentPath.hashCode();
 }