/** * Licensed to the Apache Software Foundation (ASF) under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional information regarding * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the License. You may obtain a * copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.aliyun.odps.volume; import java.util.HashMap; import java.util.Map; import com.aliyun.odps.VolumeException; import com.aliyun.odps.tunnel.VolumeFSErrorCode; /** * A proxy that handle all common problems caused by volume path * * @author Emerson Zhao [mailto:zhenyi.zzy@alibaba-inc.com] * */ public abstract class VolumeFSJobRunnerProxy<T> { public static final String CUR_EXCEPTION = "volume_job_cur_exception"; /** * Do main job * * @param path * @param params * @throws VolumeException */ abstract public T doJob(String path, Map<String, Object> params) throws VolumeException; /** * Handle {@link VolumeException} which contains errCode "VolumeMissing" * * @param path * @param params * @throws VolumeException */ abstract public T onVolumeMissing(String path, Map<String, Object> params) throws VolumeException; /** * Handle {@link VolumeException} which contains errCode "NoSuchMissing" * * @param path * @param params * @throws VolumeException */ abstract public T onNoSuchVolume(String path, Map<String, Object> params) throws VolumeException; /** * Handle {@link VolumeException} which contains errCode "InvalidPath" * * @param path * @param params * @throws VolumeException */ public T onInvalidPath(String path, Map<String, Object> params) throws VolumeException { VolumeException e = (VolumeException) params.get(CUR_EXCEPTION); throw e; } /** * Handle {@link VolumeException} which contains errCode "PathAlreadyExists" * * @param path * @param params * @throws VolumeException */ public T onPathAlreadyExists(String path, Map<String, Object> params) throws VolumeException { VolumeException e = (VolumeException) params.get(CUR_EXCEPTION); throw e; } /** * Run job proxy * * @param path * @param params * @throws VolumeException */ public T run(String path, Map<String, Object> params) throws VolumeException { try { VolumeFSUtil.checkPath(path); return doJob(path, params); } catch (VolumeException e) { if (params == null) { params = new HashMap<String, Object>(); } params.put(CUR_EXCEPTION, e); if (VolumeFSErrorCode.NoSuchVolume.equalsIgnoreCase(e.getErrCode())) { return onNoSuchVolume(path, params); } else if (VolumeFSErrorCode.VolumeMissing.equalsIgnoreCase(e.getErrCode())) { return onVolumeMissing(path, params); } else if (VolumeFSErrorCode.InvalidPath.equalsIgnoreCase(e.getErrCode())) { return onInvalidPath(path, params); } else if (VolumeFSErrorCode.PathAlreadyExists.equalsIgnoreCase(e.getErrCode())) { return onPathAlreadyExists(path, params); } throw e; } } }