Java tutorial
/** * The MIT License (MIT) * * Copyright (c) 2014 <mickael.jeanroy@gmail.com> * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.github.mjeanroy.springmvc.view.mustache.commons; import com.github.mjeanroy.springmvc.view.mustache.exceptions.MustacheIOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import java.io.BufferedReader; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.util.Collection; /** * Common static IO Utilities. */ public final class IOUtils { /** * Class logger. */ private static final Logger log = LoggerFactory.getLogger(IOUtils.class); /** * Buffer size to read files. */ private static final int BUFFER_SIZE = 1024; /** * Line separator, system dependent. */ private static final String LINE_SEPARATOR = System.getProperty("line.separator"); private IOUtils() { } /** * Read input reader: extract content and return it as * a String. * * @param reader Reader input. * @return String content. * @throws MustacheIOException If an IO exception occurs during reading operation. */ public static String read(final Reader reader) { final BufferedReader buffer = new BufferedReader(reader, BUFFER_SIZE); try { StringBuilder sb = new StringBuilder(); String line; boolean started = false; // Read line by line while ((line = buffer.readLine()) != null) { if (started) { sb.append(LINE_SEPARATOR); } sb.append(line); started = true; } return sb.toString(); } catch (IOException ex) { throw new MustacheIOException(ex); } finally { closeQuietly(buffer); } } /** * Return an input stream from given name. * Name is searched into the classpath. * Name can contains ant style pattern. * * @param name Name. * @return Input Stream. */ public static InputStream getStream(String name) { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(IOUtils.class.getClassLoader()); InputStream stream = getInputStreamWithResolver(resolver, name); // Not Found if (stream == null) { throw new MustacheIOException("Unable to locate {}" + name); } return stream; } /** * Return an input stream from given names. * First result returning a valid stream is returned. * Names are searched into the classpath. * Names can contains ant style pattern. * * @param names Names collection. * @return Input Stream. * @throws MustacheIOException If everything fail. */ public static InputStream getFirstAvailableStream(Collection<String> names) { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(IOUtils.class.getClassLoader()); for (String name : names) { try { InputStream stream = getInputStreamWithResolver(resolver, name); if (stream != null) { return stream; } } catch (MustacheIOException ex) { // Go to the next test } } throw new MustacheIOException("Unable to locate one of: " + names); } private static InputStream getInputStreamWithResolver(ResourcePatternResolver resolver, String name) { try { Resource[] resources = resolver.getResources(name); // Not Found if (resources.length == 0) { log.debug("Found zero results with pattern: {}", name); return null; } log.debug("Found {} results with pattern: {}", resources.length, name); if (log.isTraceEnabled()) { for (Resource resource : resources) { log.trace(" -> Found: {}", resource.getFilename()); } } return resources[0].getInputStream(); } catch (IOException ex) { throw new MustacheIOException("I/O Error with " + name, ex); } } /** * Close a {@link java.io.Closeable} object and do not throws a Checked Exception * if an exception occurs. * * @param stream Closeable stream. */ private static void closeQuietly(Closeable stream) { try { stream.close(); } catch (IOException ex) { // Just log. log.debug(ex.getMessage(), ex); } } }