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);
}