/******************************************************************************* * Copyright 2012 André Rouél * * Licensed 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 net.sf.uadetector.internal.util; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.MalformedURLException; import java.net.URL; import java.nio.charset.Charset; import javax.annotation.Nonnull; import net.sf.qualitycheck.Check; import net.sf.qualitycheck.exception.IllegalStateOfArgumentException; import net.sf.uadetector.exception.CanNotOpenStreamException; /** * This class is intended to provide URL utility functions that encapsulate the checked exceptions like * {@link MalformedURLException} during the construction of an URL or the {@link IOException} while opening a stream to * an {@code URL}. * * @author André Rouél */ public final class UrlUtil { /** * Creates an {@code URL} instance from the given {@code String} representation.<br> * <br> * This method tunnels a {@link MalformedURLException} by an {@link IllegalStateOfArgumentException}. * * @param url * {@code String} representation of an {@code URL} * @return new {@code URL} instance * @throws net.sf.qualitycheck.exception.IllegalNullArgumentException * if the given argument is {@code null} * @throws IllegalStateOfArgumentException * if the string representation of the given URL is invalid and a {@link MalformedURLException} occurs */ public static URL build(@Nonnull final String url) { Check.notNull(url, "url"); URL ret = null; try { ret = new URL(url); } catch (final MalformedURLException e) { throw new IllegalStateOfArgumentException("The given string is not a valid URL: " + url, e); } return ret; } /** * Tries to open an {@link InputStream} to the given {@link URL}. * * @param url * URL which should be opened * @return opened stream * @throws net.sf.qualitycheck.exception.IllegalNullArgumentException * if the given argument is {@code null} * @throws CanNotOpenStreamException * if no stream to the given {@code URL} can be established */ public static InputStream open(@Nonnull final URL url) { Check.notNull(url, "url"); final InputStream ret; try { ret = url.openStream(); } catch (final IOException e) { throw new CanNotOpenStreamException(url.toString(), e); } return ret; } /** * Reads the content of the passed {@link URL} as string representation. * * @param url * URL to <em>UAS data</em> * @param charset * the character set in which the data should be read * @return content as {@code String} * @throws net.sf.qualitycheck.exception.IllegalNullArgumentException * if any of the given arguments is {@code null} * @throws CanNotOpenStreamException * if no stream to the given {@code URL} can be established * @throws IOException * if an I/O error occurs */ public static String read(@Nonnull final URL url, @Nonnull final Charset charset) throws IOException { Check.notNull(url, "url"); Check.notNull(charset, "charset"); final InputStream inputStream = open(url); BufferedReader reader = null; final StringBuilder buffer = new StringBuilder(); boolean threw = true; try { reader = new BufferedReader(new InputStreamReader(inputStream, charset)); buffer.append(readAll(reader)); threw = false; } finally { Closeables.close(reader, threw); Closeables.close(inputStream, false); } return buffer.toString(); } /** * Reads the entire contents via the given {@link Reader} as string. * * @param reader * {@code Reader} to read the entire contents * @return the read contents as string * @throws IOException * If an I/O error occurs */ private static String readAll(@Nonnull final Reader reader) throws IOException { final StringBuilder buffer = new StringBuilder(); int cp; while ((cp = reader.read()) != -1) { buffer.append((char) cp); } return buffer.toString(); } /** * Gets the URL to a given {@code File}. * * @param file * file to be converted to a URL * @return an URL to the passed file * @throws IllegalStateException * if no URL can be resolved to the given file */ public static URL toUrl(@Nonnull final File file) { Check.notNull(file, "file"); URL url = null; try { url = file.toURI().toURL(); } catch (final MalformedURLException e) { throw new IllegalStateException("Can not construct an URL for passed file.", e); } return url; } /** * <strong>Attention:</strong> This class is not intended to create objects from it. */ private UrlUtil() { // This class is not intended to create objects from it. } }