public boolean mkdirs()

in odps-sdk/odps-sdk-volumefs/src/main/java/com/aliyun/odps/volume/VolumeFSClient.java [160:253]


  public boolean mkdirs(String path) throws VolumeException {
    return new VolumeFSJobRunnerProxy<Boolean>() {

      @Override
      public Boolean doJob(String path, Map<String, Object> params) throws VolumeException {
        boolean isExternal = false;
        String pathName = null;
        String volumeName = null;
        try {
          String[] volumeAndPath = VolumeFSUtil.getVolumeAndPath(path);
          volumeName = volumeAndPath[0];
          pathName = volumeAndPath[1];
          isExternal = isExternalVolume(volumeName);
        } catch (Exception ignored) {
          // not external volume may have no volume name
        }

        if (isExternal) {
          if (pathName == null || volumeName == null) {
            throw new VolumeException(VolumeFSErrorCode.NoSuchVolume,
                                      VolumeFSErrorMessageGenerator.isNotAValidODPSVolumeFSFilename(
                                          path));
          }
          if (!pathName.endsWith(VolumeFSConstants.SEPARATOR)) {
            pathName = pathName + VolumeFSConstants.SEPARATOR;
          }
          putObjectWithHttp(odps.getDefaultProject(), volumeName, pathName,
                            new ByteArrayInputStream(new byte[0]));
        } else {
          VolumeFSFile.create(odps.getDefaultProject(), path, true, odps.getRestClient());
        }
        return true;
      }

      @Override
      public Boolean onVolumeMissing(String path, Map<String, Object> params)
          throws VolumeException {
        throw new VolumeException(VolumeFSErrorCode.PathAlreadyExists,
            VolumeFSErrorMessageGenerator.fileExists(path));
      }

      @Override
      public Boolean onNoSuchVolume(String path, Map<String, Object> params) throws VolumeException {

        try {
          odps.volumes().create(VolumeFSUtil.getVolumeFromPath(path),
              VolumeFSConstants.CREATE_VOLUME_COMMENT, Volume.Type.NEW);
        } catch (Exception e) {
          throw new VolumeException(e);
        }
        if (VolumeFSUtil.checkPathIsJustVolume(path)) {
          return true;
        } else {
          return doJob(path, params);
        }
      }

      @Override
      public Boolean onInvalidPath(String path, Map<String, Object> params) throws VolumeException {
        // If the path is a volume name , will return true
        if (VolumeFSUtil.checkPathIsJustVolume(path)) {
          try {
            if (!odps.volumes().exists(VolumeFSUtil.getVolumeFromPath(path))) {
              odps.volumes().create(VolumeFSUtil.getVolumeFromPath(path),
                  VolumeFSConstants.CREATE_VOLUME_COMMENT, Volume.Type.NEW);
            }
          } catch (OdpsException e) {
            throw new VolumeException(e);
          }
          return true;
        } else {
          throw (VolumeException) params.get(CUR_EXCEPTION);
        }
      }

      @Override
      public Boolean onPathAlreadyExists(String path, Map<String, Object> params)
          throws VolumeException {
        VolumeFSFile file =
            odps.volumes().get(VolumeFSUtil.getVolumeFromPath(path)).getVolumeFSFile(path);
        try {
          file.reload();
        } catch (OdpsException oe) {
          throw new VolumeException(oe);
        }
        if (Boolean.TRUE.equals(file.getIsdir())) {
          return Boolean.TRUE;
        } else {
          throw (VolumeException) params.get(CUR_EXCEPTION);
        }
      }

    }.run(path, null);
  }