private boolean isXmlStringSimpleType(XSType type) {
   if (isXMLString(type)) {
     return true;
   } else if (isXMLAnyType(type)) {
     return false; // reached the bottom of the recursion. Nothing found.
   } else {
     return isXmlStringSimpleType(type.getBaseType()); // traversing down
   }
 }
  /** Creates the ExecutableTask from the Schema tree. */
  private void createResult(XSSchema schema) {

    execTask = new ExecutableTask();

    // Get the "task" xs:element.
    XSElementDecl task = schema.getElementDecl("task");

    // We know it's an xs:complexType.
    XSComplexType taskType = task.getType().asComplexType();

    // Get the xs:sequence of elements of the anonymous xs:complexType.
    // A model group can be xs:all, xs:choice or xs:sequence.
    XSParticle taskParticle = taskType.getContentType().asParticle();
    XSModelGroup taskSequence = taskParticle.getTerm().asModelGroup();

    // Get the direct children in the xs:sequence.
    XSParticle taskElemParticles[] = taskSequence.getChildren();
    for (XSParticle taskElemParticle : taskElemParticles) {

      XSElementDecl taskElem = taskElemParticle.getTerm().asElementDecl();

      if (taskElem.getName().equals("execInfo")) { // Displayable info for the UI.

        // We have the "execInfo" element.
        ExecutableInfo execInfo = new ExecutableInfo();

        // We know it's an xs:complexType.
        XSComplexType infoType = taskElem.getType().asComplexType();

        XSParticle infoParticle = infoType.getContentType().asParticle();
        XSModelGroup infoSequence = infoParticle.getTerm().asModelGroup();

        XSParticle infoElemParticles[] = infoSequence.getChildren();
        for (XSParticle infoElemParticle : infoElemParticles) {

          XSElementDecl infoElem = infoElemParticle.getTerm().asElementDecl();
          XSSimpleType simpleType = infoElem.getType().asSimpleType();

          XSRestrictionSimpleType restrictionSimple = simpleType.asRestriction();

          XSFacet facet = restrictionSimple.getDeclaredFacets().iterator().next();
          switch (infoElem.getName()) {
            case "name":
              execInfo.setExecName(facet.getValue().toString());
              break;
            case "type":
              execInfo.setExecType(facet.getValue().toString());
              break;
            case "description":
              execInfo.setExecDescription(facet.getValue().toString());
              break;
          }
        }

        execTask.setExecInfo(execInfo);

      } else {

        XSType taskElemType = taskElem.getType();
        if (taskElemType.isSimpleType()) {

          // We do not check constraints. They will be validated later.
          ExecutableParameter param = new ExecutableParameter();
          param.setParamName(taskElem.getName());

          execTask.addParameter(param);

        } else if (taskElemType.isComplexType()) {
          // Refers to inputFile and outputFile.
          // No need to check these since they are always the same.
        }
      }
    }
  }