docs: @Override
      public SpringBootUtilityReturnCodes handleTask(ConsoleWrapper stdin, PrintStream stdout, PrintStream stderr, String[] args) throws Exception {
          this.stdin = stdin;
          this.stdout = stdout;
          this.stderr = stderr;
  
          validateArgumentList(args);
  
          String sourceAppPath = getArgumentValue(ARG_SOURCE_APP, args);
          String destThinAppPath = getArgumentValue(ARG_DEST_THIN_APP, args);
          String destLibCachePath = getArgumentValue(ARG_DEST_LIB_CACHE, args);
          String parentLibCachePath = getArgumentValue(ARG_PARENT_LIB_CACHE, args);
  
          if (!fileUtility.isFile(sourceAppPath)) {
              stdout.println(getMessage("thin.abort"));
              stdout.println(getMessage("thin.appNotFound", sourceAppPath));
              return SpringBootUtilityReturnCodes.ERR_APP_NOT_FOUND;
          }
          File sourceAppFile = new File(sourceAppPath).getAbsoluteFile();
  
          if (destThinAppPath == null) {
              String appName = sourceAppFile.getName();
              int lastDot = appName.lastIndexOf('.');
              if (lastDot > 0) {
                  appName = appName.substring(0, lastDot + 1) + SpringConstants.SPRING_APP_TYPE;
              } else {
                  appName += "." + SpringConstants.SPRING_APP_TYPE;
              }
              destThinAppPath = (sourceAppFile.getParent() == null ? "" : sourceAppFile.getParent()) + File.separator + appName;
          }
          if (fileUtility.isDirectory(destThinAppPath)) {
              stdout.println(getMessage("thin.abort"));
              stdout.println(getMessage("thin.appTargetIsDirectory", destThinAppPath));
              return SpringBootUtilityReturnCodes.ERR_APP_DEST_IS_DIR;
          }
          File thinAppFile = new File(destThinAppPath).getAbsoluteFile();
          if (!fileUtility.mkDirs(thinAppFile.getParentFile(), stdout)) {
              return SpringBootUtilityReturnCodes.ERR_MAKE_DIR;
          }
  
          if (destLibCachePath == null) {
              destLibCachePath = (sourceAppFile.getParent() == null ? "" : sourceAppFile.getParent()) + File.separator + SpringConstants.SPRING_LIB_CACHE_NAME;
          }
          if (fileUtility.isFile(destLibCachePath)) {
              stdout.println(getMessage("thin.abort"));
              stdout.println(getMessage("thin.libCacheIsFile", destLibCachePath));
              return SpringBootUtilityReturnCodes.ERR_LIB_DEST_IS_FILE;
          }
          File libCache = new File(destLibCachePath).getAbsoluteFile();
          if (!fileUtility.mkDirs(libCache, stdout)) {
              return SpringBootUtilityReturnCodes.ERR_MAKE_DIR;
          }
          File parentLibCache = null;
          if (parentLibCachePath != null) {
              parentLibCache = new File(parentLibCachePath).getAbsoluteFile();
              if (!fileUtility.mkDirs(parentLibCache, stdout)) {
                  return SpringBootUtilityReturnCodes.ERR_MAKE_DIR;
              }
          }
  
          performThinTask(sourceAppFile, thinAppFile, libCache, parentLibCache);
  
          return SpringBootUtilityReturnCodes.OK;
      }