| /** |
| * 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 org.apache.hadoop.fs; |
| |
| import java.io.IOException; |
| |
| /** |
| * Exceptions based on standard posix/linux style exceptions for path related |
| * errors. Returns an exception with the format "path: standard error string". |
| * |
| * This exception corresponds to Error Input/ouput(EIO) |
| */ |
| public class PathIOException extends IOException { |
| static final long serialVersionUID = 0L; |
| private static final String EIO = "Input/output error"; |
| // NOTE: this really should be a Path, but a Path is buggy and won't |
| // return the exact string used to construct the path, and it mangles |
| // uris with no authority |
| private String operation; |
| private String path; |
| private String targetPath; |
| |
| /** |
| * Constructor a generic I/O error exception |
| * @param path for the exception |
| */ |
| public PathIOException(String path) { |
| this(path, EIO, null); |
| } |
| |
| /** |
| * Appends the text of a Throwable to the default error message |
| * @param path for the exception |
| * @param cause a throwable to extract the error message |
| */ |
| public PathIOException(String path, Throwable cause) { |
| this(path, EIO, cause); |
| } |
| |
| /** |
| * Avoid using this method. Use a subclass of PathIOException if |
| * possible. |
| * @param path for the exception |
| * @param error custom string to use an the error text |
| */ |
| public PathIOException(String path, String error) { |
| this(path, error, null); |
| } |
| |
| protected PathIOException(String path, String error, Throwable cause) { |
| super(error, cause); |
| this.path = path; |
| } |
| |
| /** Format: |
| * cmd: {operation} `path' {to `target'}: error string |
| */ |
| @Override |
| public String getMessage() { |
| StringBuilder message = new StringBuilder(); |
| if (operation != null) { |
| message.append(operation + " "); |
| } |
| message.append(formatPath(path)); |
| if (targetPath != null) { |
| message.append(" to " + formatPath(targetPath)); |
| } |
| message.append(": " + super.getMessage()); |
| if (getCause() != null) { |
| message.append(": " + getCause().getMessage()); |
| } |
| return message.toString(); |
| } |
| |
| /** @return Path that generated the exception */ |
| public Path getPath() { return new Path(path); } |
| |
| /** @return Path if the operation involved copying or moving, else null */ |
| public Path getTargetPath() { |
| return (targetPath != null) ? new Path(targetPath) : null; |
| } |
| |
| /** |
| * Optional operation that will preface the path |
| * @param operation a string |
| */ |
| public void setOperation(String operation) { |
| this.operation = operation; |
| } |
| |
| /** |
| * Optional path if the exception involved two paths, ex. a copy operation |
| * @param targetPath the of the operation |
| */ |
| public void setTargetPath(String targetPath) { |
| this.targetPath = targetPath; |
| } |
| |
| private String formatPath(String path) { |
| return "`" + path + "'"; |
| } |
| } |