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 argument. 067 * 068 * @param i the input argument. 069 * @param consumer Consumes the value. 070 * @throws UncheckedIOException if an I/O error occurs. 071 * @since 2.18.0 072 */ 073 public static void accept(final IOIntConsumer consumer, final int i) { 074 try { 075 consumer.accept(i); 076 } catch (final IOException e) { 077 throw wrap(e); 078 } 079 } 080 081 /** 082 * Accepts an IO consumer with the given arguments. 083 * 084 * @param <T> the first input type. 085 * @param <U> the second input type. 086 * @param <V> the third input type. 087 * @param t the first input argument. 088 * @param u the second input argument. 089 * @param v the third input argument. 090 * @param consumer Consumes the value. 091 * @throws UncheckedIOException if an I/O error occurs. 092 */ 093 public static <T, U, V> void accept(final IOTriConsumer<T, U, V> consumer, final T t, final U u, final V v) { 094 try { 095 consumer.accept(t, u, v); 096 } catch (final IOException e) { 097 throw wrap(e); 098 } 099 } 100 101 /** 102 * Applies an IO function with the given arguments. 103 * 104 * @param <T> the first function argument type. 105 * @param <U> the second function argument type. 106 * @param <R> the return type. 107 * @param function the function. 108 * @param t the first function argument. 109 * @param u the second function argument. 110 * @return the function result. 111 * @throws UncheckedIOException if an I/O error occurs. 112 */ 113 public static <T, U, R> R apply(final IOBiFunction<T, U, R> function, final T t, final U u) { 114 try { 115 return function.apply(t, u); 116 } catch (final IOException e) { 117 throw wrap(e); 118 } 119 } 120 121 /** 122 * Applies an IO function with the given arguments. 123 * 124 * @param function the function. 125 * @param <T> the first function argument type. 126 * @param <R> the return type. 127 * @param t the first function argument. 128 * @return the function result. 129 * @throws UncheckedIOException if an I/O error occurs. 130 */ 131 public static <T, R> R apply(final IOFunction<T, R> function, final T t) { 132 try { 133 return function.apply(t); 134 } catch (final IOException e) { 135 throw wrap(e); 136 } 137 } 138 139 /** 140 * Applies an IO quad-function with the given arguments. 141 * 142 * @param function the function. 143 * @param <T> the first function argument type. 144 * @param <U> the second function argument type. 145 * @param <V> the third function argument type. 146 * @param <W> the fourth function argument type. 147 * @param <R> the return type. 148 * @param t the first function argument. 149 * @param u the second function argument. 150 * @param v the third function argument. 151 * @param w the fourth function argument. 152 * @return the function result. 153 * @throws UncheckedIOException if an I/O error occurs. 154 */ 155 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) { 156 try { 157 return function.apply(t, u, v, w); 158 } catch (final IOException e) { 159 throw wrap(e); 160 } 161 } 162 163 /** 164 * Applies an IO tri-function with the given arguments. 165 * 166 * @param <T> the first function argument type. 167 * @param <U> the second function argument type. 168 * @param <V> the third function argument type. 169 * @param <R> the return type. 170 * @param function the function. 171 * @param t the first function argument. 172 * @param u the second function argument. 173 * @param v the third function argument. 174 * @return the function result. 175 * @throws UncheckedIOException if an I/O error occurs. 176 */ 177 public static <T, U, V, R> R apply(final IOTriFunction<T, U, V, R> function, final T t, final U u, final V v) { 178 try { 179 return function.apply(t, u, v); 180 } catch (final IOException e) { 181 throw wrap(e); 182 } 183 } 184 185 /** 186 * Compares the arguments with the comparator. 187 * 188 * @param <T> the first function argument type. 189 * @param comparator the function. 190 * @param t the first function argument. 191 * @param u the second function argument. 192 * @return the comparator result. 193 * @throws UncheckedIOException if an I/O error occurs. 194 */ 195 public static <T> int compare(final IOComparator<T> comparator, final T t, final T u) { 196 try { 197 return comparator.compare(t, u); 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 * @return result from the supplier. 209 * @throws UncheckedIOException if an I/O error occurs. 210 */ 211 public static <T> T get(final IOSupplier<T> supplier) { 212 try { 213 return supplier.get(); 214 } catch (final IOException e) { 215 throw wrap(e); 216 } 217 } 218 219 /** 220 * Gets the result from an IO supplier. 221 * 222 * @param <T> the return type of the operations. 223 * @param supplier Supplies the return value. 224 * @param message The UncheckedIOException message if an I/O error occurs. 225 * @return result from the supplier. 226 * @throws UncheckedIOException if an I/O error occurs. 227 */ 228 public static <T> T get(final IOSupplier<T> supplier, final Supplier<String> message) { 229 try { 230 return supplier.get(); 231 } catch (final IOException e) { 232 throw wrap(e, message); 233 } 234 } 235 236 /** 237 * Gets the result from an IO int supplier. 238 * 239 * @param supplier Supplies the return value. 240 * @return result from the supplier. 241 * @throws UncheckedIOException if an I/O error occurs. 242 * @since 2.14.0 243 */ 244 public static int getAsInt(final IOIntSupplier supplier) { 245 try { 246 return supplier.getAsInt(); 247 } catch (final IOException e) { 248 throw wrap(e); 249 } 250 } 251 252 /** 253 * Gets the result from an IO int supplier. 254 * 255 * @param supplier Supplies the return value. 256 * @param message The UncheckedIOException message if an I/O error occurs. 257 * @return result from the supplier. 258 * @throws UncheckedIOException if an I/O error occurs. 259 * @since 2.14.0 260 */ 261 public static int getAsInt(final IOIntSupplier supplier, final Supplier<String> message) { 262 try { 263 return supplier.getAsInt(); 264 } catch (final IOException e) { 265 throw wrap(e, message); 266 } 267 } 268 269 /** 270 * Gets the result from an IO long supplier. 271 * 272 * @param supplier Supplies the return value. 273 * @return result from the supplier. 274 * @throws UncheckedIOException if an I/O error occurs. 275 * @since 2.14.0 276 */ 277 public static long getAsLong(final IOLongSupplier supplier) { 278 try { 279 return supplier.getAsLong(); 280 } catch (final IOException e) { 281 throw wrap(e); 282 } 283 } 284 285 /** 286 * Gets the result from an IO long supplier. 287 * 288 * @param supplier Supplies the return value. 289 * @param message The UncheckedIOException message if an I/O error occurs. 290 * @return result from the supplier. 291 * @throws UncheckedIOException if an I/O error occurs. 292 * @since 2.14.0 293 */ 294 public static long getAsLong(final IOLongSupplier supplier, final Supplier<String> message) { 295 try { 296 return supplier.getAsLong(); 297 } catch (final IOException e) { 298 throw wrap(e, message); 299 } 300 } 301 302 /** 303 * Runs an IO runnable. 304 * 305 * @param runnable The runnable to run. 306 * @throws UncheckedIOException if an I/O error occurs. 307 */ 308 public static void run(final IORunnable runnable) { 309 try { 310 runnable.run(); 311 } catch (final IOException e) { 312 throw wrap(e); 313 } 314 } 315 316 /** 317 * Runs an IO runnable. 318 * 319 * @param runnable The runnable to run. 320 * @param message The UncheckedIOException message if an I/O error occurs. 321 * @throws UncheckedIOException if an I/O error occurs. 322 * @since 2.14.0 323 */ 324 public static void run(final IORunnable runnable, final Supplier<String> message) { 325 try { 326 runnable.run(); 327 } catch (final IOException e) { 328 throw wrap(e, message); 329 } 330 } 331 332 /** 333 * Tests an IO predicate. 334 * 335 * @param <T> the type of the input to the predicate. 336 * @param predicate the predicate. 337 * @param t the input to the predicate. 338 * @return {@code true} if the input argument matches the predicate, otherwise {@code false}. 339 */ 340 public static <T> boolean test(final IOPredicate<T> predicate, final T t) { 341 try { 342 return predicate.test(t); 343 } catch (final IOException e) { 344 throw wrap(e); 345 } 346 } 347 348 /** 349 * Constructs a new {@link UncheckedIOException} for the given exception. 350 * 351 * @param e The exception to wrap. 352 * @return a new {@link UncheckedIOException}. 353 */ 354 private static UncheckedIOException wrap(final IOException e) { 355 return new UncheckedIOException(e); 356 } 357 358 /** 359 * Constructs a new {@link UncheckedIOException} for the given exception and detail message. 360 * 361 * @param e The exception to wrap. 362 * @param message The UncheckedIOException message if an I/O error occurs. 363 * @return a new {@link UncheckedIOException}. 364 */ 365 private static UncheckedIOException wrap(final IOException e, final Supplier<String> message) { 366 return new UncheckedIOException(message.get(), e); 367 } 368 369 /** 370 * No instances needed. 371 */ 372 private Uncheck() { 373 // no instances needed. 374 } 375}