/**
   * Parses the given {@link de.xirp.profile.Robot robot} file and returns the resulting {@link
   * de.xirp.profile.Robot robot} bean. <br>
   * <br>
   * This method calls the {@link de.xirp.profile.ProfileParser#parseComSpec(String)} method for all
   * available {@link de.xirp.profile.CommunicationSpecification comm-spec} file names from the just
   * created {@link de.xirp.profile.Robot robot} object. At return time of the method the returned
   * {@link de.xirp.profile.Robot robot} is complete including the {@link
   * de.xirp.profile.CommunicationSpecification comm-specs}.
   *
   * @param fileName The XML robot file name (without postfix and path).
   * @param factory The factory which is used to load the XML schema definition used for validating
   *     the XML.
   * @return the parsed robot or <code>null</code> if an error occurred.
   * @see de.xirp.profile.Robot
   * @see de.xirp.profile.CommunicationSpecification
   */
  private static Robot parseRobot(String fileName, SchemaFactory factory) {
    if (!Util.isEmpty(fileName)) {
      try {
        JAXBContext jc = JAXBContext.newInstance(Robot.class);
        Unmarshaller um = jc.createUnmarshaller();

        try {
          Schema schema = factory.newSchema(new File(Constants.CONF_ROBOTS_XML_SCHEMA));
          um.setSchema(schema);
        } catch (SAXException e) {
          logClass.error(
              "Error: "
                  + e.getMessage()
                  + //$NON-NLS-1$
                  Constants.LINE_SEPARATOR,
              e);
        }

        Robot robot =
            (Robot)
                um.unmarshal(
                    new File(
                        Constants.CONF_ROBOTS_DIR
                            + File.separator
                            + fileName
                            + Constants.ROBOT_POSTFIX));

        String cmsFileName = robot.getCommSpecFileName();
        CommunicationSpecification comSpec = parseComSpec(cmsFileName, factory);
        if (comSpec.isComplete()) {
          robot.setCommunicationSpecification(comSpec);
        } else {
          logClass.warn(
              Constants.LINE_SEPARATOR
                  + I18n.getString(
                      "ProfileParser.log.comspecNotCompleted", //$NON-NLS-1$
                      Constants.LINE_SEPARATOR,
                      (cmsFileName + Constants.COMM_SPEC_POSTFIX))
                  + Constants.LINE_SEPARATOR);
        }

        robot.setBotFile(new File(Constants.CONF_ROBOTS_DIR, fileName));
        return robot;
      } catch (JAXBException e) {
        logClass.error("Error " + e.getMessage() + Constants.LINE_SEPARATOR, e);
        return null;
      }
    } else {
      return null;
    }
  }
  /**
   * Parses the given {@link de.xirp.profile.CommunicationSpecification comm-spec} file and returns
   * the resulting {@link de.xirp.profile.CommunicationSpecification comm-spec} bean.
   *
   * @param fileName The XML comm-spec file name (without postfix and path).
   * @param factory The factory which is used to load the XML schema definition used for validating
   *     the XML.
   * @return the parsed communicationSpecification or <code>null</code> if an error occurred.
   */
  private static CommunicationSpecification parseComSpec(String fileName, SchemaFactory factory) {

    if (!Util.isEmpty(fileName)) {
      CommunicationSpecification comSpec;
      try {
        JAXBContext jc = JAXBContext.newInstance(CommunicationSpecification.class);
        Unmarshaller um = jc.createUnmarshaller();
        try {
          Schema schema = factory.newSchema(new File(Constants.CONF_COMMSPECS_XML_SCHEMA));
          um.setSchema(schema);
        } catch (SAXException e) {
          logClass.error(
              "Error: "
                  + e.getMessage()
                  + //$NON-NLS-1$
                  Constants.LINE_SEPARATOR,
              e);
        }
        comSpec =
            (CommunicationSpecification)
                um.unmarshal(
                    new File(
                        Constants.CONF_COMMSPECS_DIR
                            + File.separator
                            + fileName
                            + Constants.COMM_SPEC_POSTFIX));

        comSpec.setCmsFile(new File(Constants.CONF_COMMSPECS_DIR, fileName));
        return comSpec;
      } catch (JAXBException e) {
        logClass.error(
            "Error "
                + e.getMessage() // $NON-NLS-1$
                + Constants.LINE_SEPARATOR,
            e);
        return null;
      }
    } else {
      return null;
    }
  }