001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018package org.apache.commons.io.function; 019 020import java.io.IOException; 021import java.io.UncheckedIOException; 022import java.util.function.Supplier; 023 024/** 025 * Unchecks calls by throwing {@link UncheckedIOException} instead of {@link IOException}. 026 * 027 * @since 2.12.0 028 */ 029public final class Uncheck { 030 031 /** 032 * Accepts an IO consumer with the given arguments. 033 * 034 * @param <T> the first input type. 035 * @param <U> the second input type. 036 * @param t the first input argument. 037 * @param u the second input argument. 038 * @param consumer Consumes the value. 039 * @throws UncheckedIOException if an I/O error occurs. 040 */ 041 public static <T, U> void accept(final IOBiConsumer<T, U> consumer, final T t, final U u) { 042 try { 043 consumer.accept(t, u); 044 } catch (final IOException e) { 045 throw wrap(e); 046 } 047 } 048 049 /** 050 * Accepts an IO consumer with the given argument. 051 * 052 * @param <T> the input type. 053 * @param t the input argument. 054 * @param consumer Consumes the value. 055 * @throws UncheckedIOException if an I/O error occurs. 056 */ 057 public static <T> void accept(final IOConsumer<T> consumer, final T t) { 058 try { 059 consumer.accept(t); 060 } catch (final IOException e) { 061 throw wrap(e); 062 } 063 } 064 065 /** 066 * Accepts an IO consumer with the given arguments. 067 * 068 * @param <T> the first input type. 069 * @param <U> the second input type. 070 * @param <V> the third input type. 071 * @param t the first input argument. 072 * @param u the second input argument. 073 * @param v the third input argument. 074 * @param consumer Consumes the value. 075 * @throws UncheckedIOException if an I/O error occurs. 076 */ 077 public static <T, U, V> void accept(final IOTriConsumer<T, U, V> consumer, final T t, final U u, final V v) { 078 try { 079 consumer.accept(t, u, v); 080 } catch (final IOException e) { 081 throw wrap(e); 082 } 083 } 084 085 /** 086 * Applies an IO function with the given arguments. 087 * 088 * @param <T> the first function argument type. 089 * @param <U> the second function argument type. 090 * @param <R> the return type. 091 * @param function the function. 092 * @param t the first function argument. 093 * @param u the second function argument. 094 * @return the function result. 095 * @throws UncheckedIOException if an I/O error occurs. 096 */ 097 public static <T, U, R> R apply(final IOBiFunction<T, U, R> function, final T t, final U u) { 098 try { 099 return function.apply(t, u); 100 } catch (final IOException e) { 101 throw wrap(e); 102 } 103 } 104 105 /** 106 * Applies an IO function with the given arguments. 107 * 108 * @param function the function. 109 * @param <T> the first function argument type. 110 * @param <R> the return type. 111 * @param t the first function argument. 112 * @return the function result. 113 * @throws UncheckedIOException if an I/O error occurs. 114 */ 115 public static <T, R> R apply(final IOFunction<T, R> function, final T t) { 116 try { 117 return function.apply(t); 118 } catch (final IOException e) { 119 throw wrap(e); 120 } 121 } 122 123 /** 124 * Applies an IO quad-function with the given arguments. 125 * 126 * @param function the function. 127 * @param <T> the first function argument type. 128 * @param <U> the second function argument type. 129 * @param <V> the third function argument type. 130 * @param <W> the fourth function argument type. 131 * @param <R> the return type. 132 * @param t the first function argument. 133 * @param u the second function argument. 134 * @param v the third function argument. 135 * @param w the fourth function argument. 136 * @return the function result. 137 * @throws UncheckedIOException if an I/O error occurs. 138 */ 139 public static <T, U, V, W, R> R apply(final IOQuadFunction<T, U, V, W, R> function, final T t, final U u, final V v, final W w) { 140 try { 141 return function.apply(t, u, v, w); 142 } catch (final IOException e) { 143 throw wrap(e); 144 } 145 } 146 147 /** 148 * Applies an IO tri-function with the given arguments. 149 * 150 * @param <T> the first function argument type. 151 * @param <U> the second function argument type. 152 * @param <V> the third function argument type. 153 * @param <R> the return type. 154 * @param function the function. 155 * @param t the first function argument. 156 * @param u the second function argument. 157 * @param v the third function argument. 158 * @return the function result. 159 * @throws UncheckedIOException if an I/O error occurs. 160 */ 161 public static <T, U, V, R> R apply(final IOTriFunction<T, U, V, R> function, final T t, final U u, final V v) { 162 try { 163 return function.apply(t, u, v); 164 } catch (final IOException e) { 165 throw wrap(e); 166 } 167 } 168 169 /** 170 * Compares the arguments with the comparator. 171 * 172 * @param <T> the first function argument type. 173 * @param comparator the function. 174 * @param t the first function argument. 175 * @param u the second function argument. 176 * @return the comparator result. 177 * @throws UncheckedIOException if an I/O error occurs. 178 */ 179 public static <T> int compare(final IOComparator<T> comparator, final T t, final T u) { 180 try { 181 return comparator.compare(t, u); 182 } catch (final IOException e) { 183 throw wrap(e); 184 } 185 } 186 187 /** 188 * Gets the result from an IO supplier. 189 * 190 * @param <T> the return type of the operations. 191 * @param supplier Supplies the return value. 192 * @return result from the supplier. 193 * @throws UncheckedIOException if an I/O error occurs. 194 */ 195 public static <T> T get(final IOSupplier<T> supplier) { 196 try { 197 return supplier.get(); 198 } catch (final IOException e) { 199 throw wrap(e); 200 } 201 } 202 203 /** 204 * Gets the result from an IO supplier. 205 * 206 * @param <T> the return type of the operations. 207 * @param supplier Supplies the return value. 208 * @param message The UncheckedIOException message if an I/O error occurs. 209 * @return result from the supplier. 210 * @throws UncheckedIOException if an I/O error occurs. 211 */ 212 public static <T> T get(final IOSupplier<T> supplier, final Supplier<String> message) { 213 try { 214 return supplier.get(); 215 } catch (final IOException e) { 216 throw wrap(e, message); 217 } 218 } 219 220 /** 221 * Gets the result from an IO int supplier. 222 * 223 * @param supplier Supplies the return value. 224 * @return result from the supplier. 225 * @throws UncheckedIOException if an I/O error occurs. 226 * @since 2.14.0 227 */ 228 public static int getAsInt(final IOIntSupplier supplier) { 229 try { 230 return supplier.getAsInt(); 231 } catch (final IOException e) { 232 throw wrap(e); 233 } 234 } 235 236 /** 237 * Gets the result from an IO int supplier. 238 * 239 * @param supplier Supplies the return value. 240 * @param message The UncheckedIOException message if an I/O error occurs. 241 * @return result from the supplier. 242 * @throws UncheckedIOException if an I/O error occurs. 243 * @since 2.14.0 244 */ 245 public static int getAsInt(final IOIntSupplier supplier, final Supplier<String> message) { 246 try { 247 return supplier.getAsInt(); 248 } catch (final IOException e) { 249 throw wrap(e, message); 250 } 251 } 252 253 /** 254 * Gets the result from an IO long supplier. 255 * 256 * @param supplier Supplies the return value. 257 * @return result from the supplier. 258 * @throws UncheckedIOException if an I/O error occurs. 259 * @since 2.14.0 260 */ 261 public static long getAsLong(final IOLongSupplier supplier) { 262 try { 263 return supplier.getAsLong(); 264 } catch (final IOException e) { 265 throw wrap(e); 266 } 267 } 268 269 /** 270 * Gets the result from an IO long supplier. 271 * 272 * @param supplier Supplies the return value. 273 * @param message The UncheckedIOException message if an I/O error occurs. 274 * @return result from the supplier. 275 * @throws UncheckedIOException if an I/O error occurs. 276 * @since 2.14.0 277 */ 278 public static long getAsLong(final IOLongSupplier supplier, final Supplier<String> message) { 279 try { 280 return supplier.getAsLong(); 281 } catch (final IOException e) { 282 throw wrap(e, message); 283 } 284 } 285 286 /** 287 * Runs an IO runnable. 288 * 289 * @param runnable The runnable to run. 290 * @throws UncheckedIOException if an I/O error occurs. 291 */ 292 public static void run(final IORunnable runnable) { 293 try { 294 runnable.run(); 295 } catch (final IOException e) { 296 throw wrap(e); 297 } 298 } 299 300 /** 301 * Runs an IO runnable. 302 * 303 * @param runnable The runnable to run. 304 * @param message The UncheckedIOException message if an I/O error occurs. 305 * @throws UncheckedIOException if an I/O error occurs. 306 * @since 2.14.0 307 */ 308 public static void run(final IORunnable runnable, final Supplier<String> message) { 309 try { 310 runnable.run(); 311 } catch (final IOException e) { 312 throw wrap(e, message); 313 } 314 } 315 316 /** 317 * Tests an IO predicate. 318 * 319 * @param <T> the type of the input to the predicate. 320 * @param predicate the predicate. 321 * @param t the input to the predicate. 322 * @return {@code true} if the input argument matches the predicate, otherwise {@code false}. 323 */ 324 public static <T> boolean test(final IOPredicate<T> predicate, final T t) { 325 try { 326 return predicate.test(t); 327 } catch (final IOException e) { 328 throw wrap(e); 329 } 330 } 331 332 /** 333 * Constructs a new {@link UncheckedIOException} for the given exception. 334 * 335 * @param e The exception to wrap. 336 * @return a new {@link UncheckedIOException}. 337 */ 338 private static UncheckedIOException wrap(final IOException e) { 339 return new UncheckedIOException(e); 340 } 341 342 /** 343 * Constructs a new {@link UncheckedIOException} for the given exception and detail message. 344 * 345 * @param e The exception to wrap. 346 * @param message The UncheckedIOException message if an I/O error occurs. 347 * @return a new {@link UncheckedIOException}. 348 */ 349 private static UncheckedIOException wrap(final IOException e, final Supplier<String> message) { 350 return new UncheckedIOException(message.get(), e); 351 } 352 353 /** 354 * No instances needed. 355 */ 356 private Uncheck() { 357 // no instances needed. 358 } 359}