docs: private boolean validateTopicTags(final IOptionsNode optionsNode, final List<String> tagNames) {
          boolean valid = true;
          if (!tagNames.isEmpty()) {
              final List<TagWrapper> tags = new ArrayList<TagWrapper>();
              for (final String tagName : tagNames) {
                  // Check if the app should be shutdown
                  if (isShuttingDown.get()) {
                      shutdown.set(true);
                      return false;
                  }
                  // Get the tag from the database
                  TagWrapper tag = null;
                  try {
                      tag = tagProvider.getTagByName(tagName);
                  } catch (NotFoundException e) {
  
                  }
  
                  // Check that it exists
                  if (tag != null) {
                      tags.add(tag);
                  } else {
                      log.error(
                              String.format(ProcessorConstants.ERROR_TAG_NONEXIST_MSG, optionsNode.getLineNumber(), tagName, optionsNode.getText()));
                      valid = false;
                  }
              }
  
              // Check that the mutex value entered is correct
              final Map<Integer, List<TagWrapper>> mapping = EntityUtilities.getCategoryMappingFromTagList(tags);
              for (final Entry<Integer, List<TagWrapper>> catEntry : mapping.entrySet()) {
                  final CategoryWrapper cat = categoryProvider.getCategory(catEntry.getKey());
                  final List<TagWrapper> catTags = catEntry.getValue();
  
                  // Check if the app should be shutdown
                  if (isShuttingDown.get()) {
                      shutdown.set(true);
                      return false;
                  }
  
                  // Check that only one tag has been set if the category is mutually exclusive
                  if (cat.isMutuallyExclusive() && catTags.size() > 1) {
                      final String errorMsg;
                      if (optionsNode instanceof Level) {
                          final String baseErrorMsg = String.format(ProcessorConstants.ERROR_LEVEL_TOO_MANY_CATS_MSG,
                                  ((Level) optionsNode).getLevelType().getTitle(), cat.getName(), optionsNode.getText());
                          if (((Level) optionsNode).getLevelType() == LevelType.BASE) {
                              errorMsg = baseErrorMsg;
                          } else {
                              errorMsg = String.format(ProcessorConstants.LINE, optionsNode.getLineNumber()) + baseErrorMsg;
                          }
                      } else {
                          errorMsg = String.format(ProcessorConstants.ERROR_TOPIC_TOO_MANY_CATS_MSG, optionsNode.getLineNumber(), cat.getName(),
                                  optionsNode.getText());
                      }
                      log.error(errorMsg);
                      valid = false;
                  }
  
                  // Check that the tag isn't a type or writer
                  if (cat.getId().equals(serverEntities.getWriterCategoryId())) {
                      final String errorMsg;
                      if (optionsNode instanceof Level) {
                          final String baseErrorMsg = String.format(ProcessorConstants.ERROR_LEVEL_WRITER_AS_TAG_MSG,
                                  ((Level) optionsNode).getLevelType().getTitle(), optionsNode.getText());
                          if (((Level) optionsNode).getLevelType() == LevelType.BASE) {
                              errorMsg = baseErrorMsg;
                          } else {
                              errorMsg = String.format(ProcessorConstants.LINE, optionsNode.getLineNumber()) + baseErrorMsg;
                          }
                      } else {
                          errorMsg = String.format(ProcessorConstants.ERROR_TOPIC_WRITER_AS_TAG_MSG, optionsNode.getLineNumber(),
                                  optionsNode.getText());
                      }
                      log.error(errorMsg);
                      valid = false;
                  }
  
                  // Check that the tag isn't a topic type
                  if (cat.getId().equals(serverEntities.getTypeCategoryId())) {
                      final String errorMsg;
                      if (optionsNode instanceof Level) {
                          final String baseErrorMsg = String.format(ProcessorConstants.ERROR_LEVEL_TYPE_AS_TAG_MSG,
                                  ((Level) optionsNode).getLevelType().getTitle(), optionsNode.getText());
                          if (((Level) optionsNode).getLevelType() == LevelType.BASE) {
                              errorMsg = baseErrorMsg;
                          } else {
                              errorMsg = String.format(ProcessorConstants.LINE, optionsNode.getLineNumber()) + baseErrorMsg;
                          }
                      } else {
                          errorMsg = String.format(ProcessorConstants.ERROR_TOPIC_TYPE_AS_TAG_MSG, optionsNode.getLineNumber(),
                                  optionsNode.getText());
                      }
                      log.error(errorMsg);
                      valid = false;
                  }
              }
          }
          return valid;
      }