| Author | DaveJarvis <email> |
|---|---|
| Date | 2020-09-12 18:47:31 GMT-0700 |
| Commit | 324e7c501e9910aa053e1c4ab640142545283d31 |
| Parent | 4b01d5b |
| Delta | 190 lines added, 34 lines removed, 156-line increase |
| +/* | ||
| + * Copyright 2020 White Magic Software, Ltd. | ||
| + * | ||
| + * All rights reserved. | ||
| + * | ||
| + * Redistribution and use in source and binary forms, with or without | ||
| + * modification, are permitted provided that the following conditions are met: | ||
| + * | ||
| + * o Redistributions of source code must retain the above copyright | ||
| + * notice, this list of conditions and the following disclaimer. | ||
| + * | ||
| + * o Redistributions in binary form must reproduce the above copyright | ||
| + * notice, this list of conditions and the following disclaimer in the | ||
| + * documentation and/or other materials provided with the distribution. | ||
| + * | ||
| + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| + */ | ||
| +package com.scrivenvar.util; | ||
| + | ||
| +import java.util.LinkedHashMap; | ||
| +import java.util.Map; | ||
| + | ||
| +/** | ||
| + * A map that removes the oldest entry once its capacity (cache size) has | ||
| + * been reached. | ||
| + * | ||
| + * @param <K> The type of key mapped to a value. | ||
| + * @param <V> The type of value mapped to a key. | ||
| + */ | ||
| +public class BoundedCache<K, V> extends LinkedHashMap<K, V> { | ||
| + private final int mCacheSize; | ||
| + | ||
| + /** | ||
| + * Constructs a new instance having a finite size. | ||
| + * | ||
| + * @param cacheSize The maximum number of entries. | ||
| + */ | ||
| + public BoundedCache( final int cacheSize ) { | ||
| + mCacheSize = cacheSize; | ||
| + } | ||
| + | ||
| + @Override | ||
| + protected boolean removeEldestEntry( | ||
| + final Map.Entry<K, V> eldest ) { | ||
| + return size() > mCacheSize; | ||
| + } | ||
| +} | ||
| +/* | ||
| + * Copyright 2020 White Magic Software, Ltd. | ||
| + * | ||
| + * All rights reserved. | ||
| + * | ||
| + * Redistribution and use in source and binary forms, with or without | ||
| + * modification, are permitted provided that the following conditions are met: | ||
| + * | ||
| + * o Redistributions of source code must retain the above copyright | ||
| + * notice, this list of conditions and the following disclaimer. | ||
| + * | ||
| + * o Redistributions in binary form must reproduce the above copyright | ||
| + * notice, this list of conditions and the following disclaimer in the | ||
| + * documentation and/or other materials provided with the distribution. | ||
| + * | ||
| + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| + */ | ||
| package com.scrivenvar.util; | ||
| import java.io.File; | ||
| import java.net.URI; | ||
| import java.net.URL; | ||
| + | ||
| +import static com.scrivenvar.util.ProtocolScheme.FILE; | ||
| +import static com.scrivenvar.util.ProtocolScheme.HTTP; | ||
| +import static org.apache.commons.compress.utils.ArchiveUtils.sanitize; | ||
| /** | ||
| * Responsible for determining the protocol of a resource. | ||
| */ | ||
| public class ProtocolResolver { | ||
| private static final String SCHEME_HTTP = "http"; | ||
| private static final String SCHEME_FILE = "file"; | ||
| private static final String SCHEME_UNKNOWN = "unknown"; | ||
| - | ||
| - /** | ||
| - * Answers {@code true} if the given protocol is either HTTP or HTTPS. | ||
| - * | ||
| - * @param protocol The protocol to compare against the web URI scheme. | ||
| - * @return {@code true} the protocol is either HTTP or HTTPS. | ||
| - */ | ||
| - public static boolean isHttp( final String protocol ) { | ||
| - return sanitize( protocol ).startsWith( SCHEME_HTTP ); | ||
| - } | ||
| - | ||
| - /** | ||
| - * Answers {@code true} if the given protocol is for a local file. | ||
| - * | ||
| - * @param protocol The protocol to compare against the file URI scheme. | ||
| - * @return {@code true} the protocol is for a local file reference. | ||
| - */ | ||
| - public static boolean isFile( String protocol ) { | ||
| - return sanitize( protocol ).startsWith( SCHEME_FILE ); | ||
| - } | ||
| /** | ||
| * Returns the protocol for a given URI or filename. | ||
| * | ||
| * @param resource Determine the protocol for this URI or filename. | ||
| * @return The protocol for the given resource. | ||
| */ | ||
| - public static String getProtocol( final String resource ) { | ||
| + public static ProtocolScheme getProtocol( final String resource ) { | ||
| String protocol; | ||
| } | ||
| - return protocol; | ||
| + return ProtocolScheme.valueFrom(protocol); | ||
| } | ||
| /** | ||
| * Returns the protocol for a given file. | ||
| * | ||
| * @param file Determine the protocol for this file. | ||
| * @return The protocol for the given file. | ||
| */ | ||
| - public static String getProtocol( final File file ) { | ||
| + private static String getProtocol( final File file ) { | ||
| String result; | ||
| try { | ||
| result = file.toURI().toURL().getProtocol(); | ||
| } catch( final Exception e ) { | ||
| result = SCHEME_UNKNOWN; | ||
| } | ||
| return result; | ||
| - } | ||
| - | ||
| - /** | ||
| - * Returns an empty string if the given string to sanitize is {@code null}, | ||
| - * otherwise the given string in lowercase. | ||
| - * | ||
| - * @param s The string to sanitize, may be {@code null}. | ||
| - * @return A non-{@code null} string. | ||
| - */ | ||
| - private static String sanitize( final String s ) { | ||
| - return s == null ? "" : s.toLowerCase(); | ||
| } | ||
| } | ||
| +/* | ||
| + * Copyright 2020 White Magic Software, Ltd. | ||
| + * | ||
| + * All rights reserved. | ||
| + * | ||
| + * Redistribution and use in source and binary forms, with or without | ||
| + * modification, are permitted provided that the following conditions are met: | ||
| + * | ||
| + * o Redistributions of source code must retain the above copyright | ||
| + * notice, this list of conditions and the following disclaimer. | ||
| + * | ||
| + * o Redistributions in binary form must reproduce the above copyright | ||
| + * notice, this list of conditions and the following disclaimer in the | ||
| + * documentation and/or other materials provided with the distribution. | ||
| + * | ||
| + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| + */ | ||
| +package com.scrivenvar.util; | ||
| + | ||
| +/** | ||
| + * Represents the type of data encoding scheme used for a universal resource | ||
| + * indicator. | ||
| + */ | ||
| +public enum ProtocolScheme { | ||
| + /** | ||
| + * Denotes either HTTP or HTTPS. | ||
| + */ | ||
| + HTTP, | ||
| + /** | ||
| + * Denotes a local file. | ||
| + */ | ||
| + FILE, | ||
| + /** | ||
| + * Could not determine schema (or is not supported by the application). | ||
| + */ | ||
| + UNKNOWN; | ||
| + | ||
| + /** | ||
| + * Answers {@code true} if the given protocol is either HTTP or HTTPS. | ||
| + * | ||
| + * @return {@code true} the protocol is either HTTP or HTTPS. | ||
| + */ | ||
| + public boolean isHttp() { | ||
| + return this == HTTP; | ||
| + } | ||
| + | ||
| + /** | ||
| + * Answers {@code true} if the given protocol is for a local file. | ||
| + * | ||
| + * @return {@code true} the protocol is for a local file reference. | ||
| + */ | ||
| + public boolean isFile() { | ||
| + return this == FILE; | ||
| + } | ||
| + | ||
| + /** | ||
| + * Determines the protocol scheme for a given string. | ||
| + * | ||
| + * @param protocol A string representing data encoding protocol scheme. | ||
| + * @return {@link #UNKNOWN} if the protocol is unrecognized, otherwise a | ||
| + * valid value from this enumeration. | ||
| + */ | ||
| + public static ProtocolScheme valueFrom( String protocol ) { | ||
| + ProtocolScheme result = UNKNOWN; | ||
| + protocol = sanitize( protocol ); | ||
| + | ||
| + for( final var scheme : values() ) { | ||
| + // This will match HTTP/HTTPS as well as FILE*, which may be inaccurate. | ||
| + if( scheme.name().startsWith( protocol ) ) { | ||
| + result = scheme; | ||
| + break; | ||
| + } | ||
| + } | ||
| + | ||
| + return result; | ||
| + } | ||
| + | ||
| + /** | ||
| + * Returns an empty string if the given string to sanitize is {@code null}, | ||
| + * otherwise the given string in uppercase. Uppercase is used to align with | ||
| + * the enum name. | ||
| + * | ||
| + * @param s The string to sanitize, may be {@code null}. | ||
| + * @return A non-{@code null} string. | ||
| + */ | ||
| + private static String sanitize( final String s ) { | ||
| + return s == null ? "" : s.toUpperCase(); | ||
| + } | ||
| +} | ||