Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/keenwrite.git

Add bounded cache, make protocol OOPier

AuthorDaveJarvis <email>
Date2020-09-12 18:47:31 GMT-0700
Commit324e7c501e9910aa053e1c4ab640142545283d31
Parent4b01d5b
Delta190 lines added, 34 lines removed, 156-line increase
src/main/java/com/scrivenvar/util/BoundedCache.java
+/*
+ * 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;
+ }
+}
src/main/java/com/scrivenvar/util/ProtocolResolver.java
+/*
+ * 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();
}
}
src/main/java/com/scrivenvar/util/ProtocolScheme.java
+/*
+ * 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();
+ }
+}