1 /* 2 * Copyright (C) 2018, Thomas Wolf <thomas.wolf@paranor.ch> 3 * and other copyright owners as documented in the project's IP log. 4 * 5 * This program and the accompanying materials are made available 6 * under the terms of the Eclipse Distribution License v1.0 which 7 * accompanies this distribution, is reproduced below, and is 8 * available at http://www.eclipse.org/org/documents/edl-v10.php 9 * 10 * All rights reserved. 11 * 12 * Redistribution and use in source and binary forms, with or 13 * without modification, are permitted provided that the following 14 * conditions are met: 15 * 16 * - Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 19 * - Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials provided 22 * with the distribution. 23 * 24 * - Neither the name of the Eclipse Foundation, Inc. nor the 25 * names of its contributors may be used to endorse or promote 26 * products derived from this software without specific prior 27 * written permission. 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 30 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 31 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 32 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 33 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 34 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 35 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 36 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 37 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 38 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 40 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 41 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 42 */ 43 package org.eclipse.jgit.transport; 44 45 import java.io.FileNotFoundException; 46 import java.io.IOException; 47 import java.io.InputStream; 48 import java.io.OutputStream; 49 import java.util.Collection; 50 import java.util.concurrent.TimeUnit; 51 52 /** 53 * An interface providing FTP operations over a {@link RemoteSession}. All 54 * operations are supposed to throw {@link FtpException} for remote file system 55 * errors and other IOExceptions on connection errors. 56 * 57 * @since 5.2 58 */ 59 public interface FtpChannel { 60 61 /** 62 * An {@link Exception} for reporting SFTP errors. 63 */ 64 static class FtpException extends IOException { 65 66 private static final long serialVersionUID = 7176525179280330876L; 67 68 public static final int OK = 0; 69 70 public static final int EOF = 1; 71 72 public static final int NO_SUCH_FILE = 2; 73 74 public static final int NO_PERMISSION = 3; 75 76 public static final int UNSPECIFIED_FAILURE = 4; 77 78 public static final int PROTOCOL_ERROR = 5; 79 80 public static final int UNSUPPORTED = 8; 81 82 private final int status; 83 84 public FtpException(String message, int status) { 85 super(message); 86 this.status = status; 87 } 88 89 public FtpException(String message, int status, Throwable cause) { 90 super(message, cause); 91 this.status = status; 92 } 93 94 public int getStatus() { 95 return status; 96 } 97 } 98 99 /** 100 * Connects the {@link FtpChannel} to the remote end. 101 * 102 * @param timeout 103 * for establishing the FTP connection 104 * @param unit 105 * of the {@code timeout} 106 * @throws IOException 107 */ 108 void connect(int timeout, TimeUnit unit) throws IOException; 109 110 /** 111 * Disconnects and {@link FtpChannel}. 112 */ 113 void disconnect(); 114 115 /** 116 * @return whether the {@link FtpChannel} is connected 117 */ 118 boolean isConnected(); 119 120 /** 121 * Changes the current remote directory. 122 * 123 * @param path 124 * target directory 125 * @throws IOException 126 * if the operation could not be performed remotely 127 */ 128 void cd(String path) throws IOException; 129 130 /** 131 * @return the current remote directory path 132 * @throws IOException 133 */ 134 String pwd() throws IOException; 135 136 /** 137 * Simplified remote directory entry. 138 */ 139 interface DirEntry { 140 String getFilename(); 141 142 long getModifiedTime(); 143 144 boolean isDirectory(); 145 } 146 147 /** 148 * Lists contents of a remote directory 149 * 150 * @param path 151 * of the directory to list 152 * @return the directory entries 153 * @throws IOException 154 */ 155 Collection<DirEntry> ls(String path) throws IOException; 156 157 /** 158 * Deletes a directory on the remote file system. The directory must be 159 * empty. 160 * 161 * @param path 162 * to delete 163 * @throws IOException 164 */ 165 void rmdir(String path) throws IOException; 166 167 /** 168 * Creates a directory on the remote file system. 169 * 170 * @param path 171 * to create 172 * @throws IOException 173 */ 174 void mkdir(String path) throws IOException; 175 176 /** 177 * Obtain an {@link InputStream} to read the contents of a remote file. 178 * 179 * @param path 180 * of the file to read 181 * 182 * @return the stream to read from 183 * @throws IOException 184 */ 185 InputStream get(String path) throws IOException; 186 187 /** 188 * Obtain an {@link OutputStream} to write to a remote file. If the file 189 * exists already, it will be overwritten. 190 * 191 * @param path 192 * of the file to read 193 * 194 * @return the stream to read from 195 * @throws IOException 196 */ 197 OutputStream put(String path) throws IOException; 198 199 /** 200 * Deletes a file on the remote file system. 201 * 202 * @param path 203 * to delete 204 * @throws IOException 205 * if the file does not exist or could otherwise not be deleted 206 */ 207 void rm(String path) throws IOException; 208 209 /** 210 * Deletes a file on the remote file system. If the file does not exist, no 211 * exception is thrown. 212 * 213 * @param path 214 * to delete 215 * @throws IOException 216 * if the file exist but could not be deleted 217 */ 218 default void delete(String path) throws IOException { 219 try { 220 rm(path); 221 } catch (FileNotFoundException e) { 222 // Ignore; it's OK if the file doesn't exist 223 } catch (FtpException f) { 224 if (f.getStatus() == FtpException.NO_SUCH_FILE) { 225 return; 226 } 227 throw f; 228 } 229 } 230 231 /** 232 * Renames a file on the remote file system. If {@code to} exists, it is 233 * replaced by {@code from}. (POSIX rename() semantics) 234 * 235 * @param from 236 * original name of the file 237 * @param to 238 * new name of the file 239 * @throws IOException 240 * @see <a href= 241 * "http://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html">stdio.h: 242 * rename()</a> 243 */ 244 void rename(String from, String to) throws IOException; 245 246 }