aboutsummaryrefslogtreecommitdiffstats
path: root/guava/src/com/google/common/cache/CacheBuilderSpec.java
diff options
context:
space:
mode:
Diffstat (limited to 'guava/src/com/google/common/cache/CacheBuilderSpec.java')
-rw-r--r--guava/src/com/google/common/cache/CacheBuilderSpec.java455
1 files changed, 0 insertions, 455 deletions
diff --git a/guava/src/com/google/common/cache/CacheBuilderSpec.java b/guava/src/com/google/common/cache/CacheBuilderSpec.java
deleted file mode 100644
index 1e03335..0000000
--- a/guava/src/com/google/common/cache/CacheBuilderSpec.java
+++ /dev/null
@@ -1,455 +0,0 @@
-/*
- * Copyright (C) 2011 The Guava Authors
- *
- * 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 com.google.common.cache;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.annotations.Beta;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Objects;
-import com.google.common.base.Splitter;
-import com.google.common.cache.LocalCache.Strength;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import javax.annotation.Nullable;
-
-/**
- * A specification of a {@link CacheBuilder} configuration.
- *
- * <p>{@code CacheBuilderSpec} supports parsing configuration off of a string, which
- * makes it especially useful for command-line configuration of a {@code CacheBuilder}.
- *
- * <p>The string syntax is a series of comma-separated keys or key-value pairs,
- * each corresponding to a {@code CacheBuilder} method.
- * <ul>
- * <li>{@code concurrencyLevel=[integer]}: sets {@link CacheBuilder#concurrencyLevel}.
- * <li>{@code initialCapacity=[integer]}: sets {@link CacheBuilder#initialCapacity}.
- * <li>{@code maximumSize=[long]}: sets {@link CacheBuilder#maximumSize}.
- * <li>{@code maximumWeight=[long]}: sets {@link CacheBuilder#maximumWeight}.
- * <li>{@code expireAfterAccess=[duration]}: sets {@link CacheBuilder#expireAfterAccess}.
- * <li>{@code expireAfterWrite=[duration]}: sets {@link CacheBuilder#expireAfterWrite}.
- * <li>{@code refreshAfterWrite=[duration]}: sets {@link CacheBuilder#refreshAfterWrite}.
- * <li>{@code weakKeys}: sets {@link CacheBuilder#weakKeys}.
- * <li>{@code softValues}: sets {@link CacheBuilder#softValues}.
- * <li>{@code weakValues}: sets {@link CacheBuilder#weakValues}.
- * </ul>
- *
- * The set of supported keys will grow as {@code CacheBuilder} evolves, but existing keys
- * will never be removed.
- *
- * <p>Durations are represented by an integer, followed by one of "d", "h", "m",
- * or "s", representing days, hours, minutes, or seconds respectively. (There
- * is currently no syntax to request expiration in milliseconds, microseconds,
- * or nanoseconds.)
- *
- * <p>Whitespace before and after commas and equal signs is ignored. Keys may
- * not be repeated; it is also illegal to use the following pairs of keys in
- * a single value:
- * <ul>
- * <li>{@code maximumSize} and {@code maximumWeight}
- * <li>{@code softValues} and {@code weakValues}
- * </ul>
- *
- * <p>{@code CacheBuilderSpec} does not support configuring {@code CacheBuilder} methods
- * with non-value parameters. These must be configured in code.
- *
- * <p>A new {@code CacheBuilder} can be instantiated from a {@code CacheBuilderSpec} using
- * {@link CacheBuilder#from(CacheBuilderSpec)} or {@link CacheBuilder#from(String)}.
- *
- * @author Adam Winer
- * @since 12.0
- */
-@Beta
-public final class CacheBuilderSpec {
- /** Parses a single value. */
- private interface ValueParser {
- void parse(CacheBuilderSpec spec, String key, @Nullable String value);
- }
-
- /** Splits each key-value pair. */
- private static final Splitter KEYS_SPLITTER = Splitter.on(',').trimResults();
-
- /** Splits the key from the value. */
- private static final Splitter KEY_VALUE_SPLITTER = Splitter.on('=').trimResults();
-
- /** Map of names to ValueParser. */
- private static final ImmutableMap<String, ValueParser> VALUE_PARSERS =
- ImmutableMap.<String, ValueParser>builder()
- .put("initialCapacity", new InitialCapacityParser())
- .put("maximumSize", new MaximumSizeParser())
- .put("maximumWeight", new MaximumWeightParser())
- .put("concurrencyLevel", new ConcurrencyLevelParser())
- .put("weakKeys", new KeyStrengthParser(Strength.WEAK))
- .put("softValues", new ValueStrengthParser(Strength.SOFT))
- .put("weakValues", new ValueStrengthParser(Strength.WEAK))
- .put("expireAfterAccess", new AccessDurationParser())
- .put("expireAfterWrite", new WriteDurationParser())
- .put("refreshAfterWrite", new RefreshDurationParser())
- .put("refreshInterval", new RefreshDurationParser())
- .build();
-
- @VisibleForTesting Integer initialCapacity;
- @VisibleForTesting Long maximumSize;
- @VisibleForTesting Long maximumWeight;
- @VisibleForTesting Integer concurrencyLevel;
- @VisibleForTesting Strength keyStrength;
- @VisibleForTesting Strength valueStrength;
- @VisibleForTesting long writeExpirationDuration;
- @VisibleForTesting TimeUnit writeExpirationTimeUnit;
- @VisibleForTesting long accessExpirationDuration;
- @VisibleForTesting TimeUnit accessExpirationTimeUnit;
- @VisibleForTesting long refreshDuration;
- @VisibleForTesting TimeUnit refreshTimeUnit;
- /** Specification; used for toParseableString(). */
- private final String specification;
-
- private CacheBuilderSpec(String specification) {
- this.specification = specification;
- }
-
- /**
- * Creates a CacheBuilderSpec from a string.
- *
- * @param cacheBuilderSpecification the string form
- */
- public static CacheBuilderSpec parse(String cacheBuilderSpecification) {
- CacheBuilderSpec spec = new CacheBuilderSpec(cacheBuilderSpecification);
- if (!cacheBuilderSpecification.isEmpty()) {
- for (String keyValuePair : KEYS_SPLITTER.split(cacheBuilderSpecification)) {
- List<String> keyAndValue = ImmutableList.copyOf(KEY_VALUE_SPLITTER.split(keyValuePair));
- checkArgument(!keyAndValue.isEmpty(), "blank key-value pair");
- checkArgument(keyAndValue.size() <= 2,
- "key-value pair %s with more than one equals sign", keyValuePair);
-
- // Find the ValueParser for the current key.
- String key = keyAndValue.get(0);
- ValueParser valueParser = VALUE_PARSERS.get(key);
- checkArgument(valueParser != null, "unknown key %s", key);
-
- String value = keyAndValue.size() == 1 ? null : keyAndValue.get(1);
- valueParser.parse(spec, key, value);
- }
- }
-
- return spec;
- }
-
- /**
- * Returns a CacheBuilderSpec that will prevent caching.
- */
- public static CacheBuilderSpec disableCaching() {
- // Maximum size of zero is one way to block caching
- return CacheBuilderSpec.parse("maximumSize=0");
- }
-
- /**
- * Returns a CacheBuilder configured according to this instance's specification.
- */
- CacheBuilder<Object, Object> toCacheBuilder() {
- CacheBuilder<Object, Object> builder = CacheBuilder.newBuilder();
- if (initialCapacity != null) {
- builder.initialCapacity(initialCapacity);
- }
- if (maximumSize != null) {
- builder.maximumSize(maximumSize);
- }
- if (maximumWeight != null) {
- builder.maximumWeight(maximumWeight);
- }
- if (concurrencyLevel != null) {
- builder.concurrencyLevel(concurrencyLevel);
- }
- if (keyStrength != null) {
- switch (keyStrength) {
- case WEAK:
- builder.weakKeys();
- break;
- default:
- throw new AssertionError();
- }
- }
- if (valueStrength != null) {
- switch (valueStrength) {
- case SOFT:
- builder.softValues();
- break;
- case WEAK:
- builder.weakValues();
- break;
- default:
- throw new AssertionError();
- }
- }
- if (writeExpirationTimeUnit != null) {
- builder.expireAfterWrite(writeExpirationDuration, writeExpirationTimeUnit);
- }
- if (accessExpirationTimeUnit != null) {
- builder.expireAfterAccess(accessExpirationDuration, accessExpirationTimeUnit);
- }
- if (refreshTimeUnit != null) {
- builder.refreshAfterWrite(refreshDuration, refreshTimeUnit);
- }
-
- return builder;
- }
-
- /**
- * Returns a string that can be used to parse an equivalent
- * {@code CacheBuilderSpec}. The order and form of this representation is
- * not guaranteed, except that reparsing its output will produce
- * a {@code CacheBuilderSpec} equal to this instance.
- */
- public String toParsableString() {
- return specification;
- }
-
- /**
- * Returns a string representation for this CacheBuilderSpec instance.
- * The form of this representation is not guaranteed.
- */
- @Override
- public String toString() {
- return Objects.toStringHelper(this).addValue(toParsableString()).toString();
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(
- initialCapacity,
- maximumSize,
- maximumWeight,
- concurrencyLevel,
- keyStrength,
- valueStrength,
- durationInNanos(writeExpirationDuration, writeExpirationTimeUnit),
- durationInNanos(accessExpirationDuration, accessExpirationTimeUnit),
- durationInNanos(refreshDuration, refreshTimeUnit));
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
- if (!(obj instanceof CacheBuilderSpec)) {
- return false;
- }
- CacheBuilderSpec that = (CacheBuilderSpec) obj;
- return Objects.equal(initialCapacity, that.initialCapacity)
- && Objects.equal(maximumSize, that.maximumSize)
- && Objects.equal(maximumWeight, that.maximumWeight)
- && Objects.equal(concurrencyLevel, that.concurrencyLevel)
- && Objects.equal(keyStrength, that.keyStrength)
- && Objects.equal(valueStrength, that.valueStrength)
- && Objects.equal(durationInNanos(writeExpirationDuration, writeExpirationTimeUnit),
- durationInNanos(that.writeExpirationDuration, that.writeExpirationTimeUnit))
- && Objects.equal(durationInNanos(accessExpirationDuration, accessExpirationTimeUnit),
- durationInNanos(that.accessExpirationDuration, that.accessExpirationTimeUnit))
- && Objects.equal(durationInNanos(refreshDuration, refreshTimeUnit),
- durationInNanos(that.refreshDuration, that.refreshTimeUnit));
- }
-
- /**
- * Converts an expiration duration/unit pair into a single Long for hashing and equality.
- * Uses nanos to match CacheBuilder implementation.
- */
- @Nullable private static Long durationInNanos(long duration, @Nullable TimeUnit unit) {
- return (unit == null) ? null : unit.toNanos(duration);
- }
-
- /** Base class for parsing integers. */
- abstract static class IntegerParser implements ValueParser {
- protected abstract void parseInteger(CacheBuilderSpec spec, int value);
-
- @Override
- public void parse(CacheBuilderSpec spec, String key, String value) {
- checkArgument(value != null && !value.isEmpty(), "value of key %s omitted", key);
- try {
- parseInteger(spec, Integer.parseInt(value));
- } catch (NumberFormatException e) {
- throw new IllegalArgumentException(
- String.format("key %s value set to %s, must be integer", key, value), e);
- }
- }
- }
-
- /** Base class for parsing integers. */
- abstract static class LongParser implements ValueParser {
- protected abstract void parseLong(CacheBuilderSpec spec, long value);
-
- @Override
- public void parse(CacheBuilderSpec spec, String key, String value) {
- checkArgument(value != null && !value.isEmpty(), "value of key %s omitted", key);
- try {
- parseLong(spec, Long.parseLong(value));
- } catch (NumberFormatException e) {
- throw new IllegalArgumentException(
- String.format("key %s value set to %s, must be integer", key, value), e);
- }
- }
- }
-
- /** Parse initialCapacity */
- static class InitialCapacityParser extends IntegerParser {
- @Override
- protected void parseInteger(CacheBuilderSpec spec, int value) {
- checkArgument(spec.initialCapacity == null,
- "initial capacity was already set to ", spec.initialCapacity);
- spec.initialCapacity = value;
- }
- }
-
- /** Parse maximumSize */
- static class MaximumSizeParser extends LongParser {
- @Override
- protected void parseLong(CacheBuilderSpec spec, long value) {
- checkArgument(spec.maximumSize == null,
- "maximum size was already set to ", spec.maximumSize);
- checkArgument(spec.maximumWeight == null,
- "maximum weight was already set to ", spec.maximumWeight);
- spec.maximumSize = value;
- }
- }
-
- /** Parse maximumWeight */
- static class MaximumWeightParser extends LongParser {
- @Override
- protected void parseLong(CacheBuilderSpec spec, long value) {
- checkArgument(spec.maximumWeight == null,
- "maximum weight was already set to ", spec.maximumWeight);
- checkArgument(spec.maximumSize == null,
- "maximum size was already set to ", spec.maximumSize);
- spec.maximumWeight = value;
- }
- }
-
- /** Parse concurrencyLevel */
- static class ConcurrencyLevelParser extends IntegerParser {
- @Override
- protected void parseInteger(CacheBuilderSpec spec, int value) {
- checkArgument(spec.concurrencyLevel == null,
- "concurrency level was already set to ", spec.concurrencyLevel);
- spec.concurrencyLevel = value;
- }
- }
-
- /** Parse weakKeys */
- static class KeyStrengthParser implements ValueParser {
- private final Strength strength;
-
- public KeyStrengthParser(Strength strength) {
- this.strength = strength;
- }
-
- @Override
- public void parse(CacheBuilderSpec spec, String key, @Nullable String value) {
- checkArgument(value == null, "key %s does not take values", key);
- checkArgument(spec.keyStrength == null, "%s was already set to %s", key, spec.keyStrength);
- spec.keyStrength = strength;
- }
- }
-
- /** Parse weakValues and softValues */
- static class ValueStrengthParser implements ValueParser {
- private final Strength strength;
-
- public ValueStrengthParser(Strength strength) {
- this.strength = strength;
- }
-
- @Override
- public void parse(CacheBuilderSpec spec, String key, @Nullable String value) {
- checkArgument(value == null, "key %s does not take values", key);
- checkArgument(spec.valueStrength == null,
- "%s was already set to %s", key, spec.valueStrength);
-
- spec.valueStrength = strength;
- }
- }
-
- /** Base class for parsing times with durations */
- abstract static class DurationParser implements ValueParser {
- protected abstract void parseDuration(
- CacheBuilderSpec spec,
- long duration,
- TimeUnit unit);
-
- @Override
- public void parse(CacheBuilderSpec spec, String key, String value) {
- checkArgument(value != null && !value.isEmpty(), "value of key %s omitted", key);
- try {
- char lastChar = value.charAt(value.length() - 1);
- TimeUnit timeUnit;
- switch (lastChar) {
- case 'd':
- timeUnit = TimeUnit.DAYS;
- break;
- case 'h':
- timeUnit = TimeUnit.HOURS;
- break;
- case 'm':
- timeUnit = TimeUnit.MINUTES;
- break;
- case 's':
- timeUnit = TimeUnit.SECONDS;
- break;
- default:
- throw new IllegalArgumentException(
- String.format("key %s invalid format. was %s, must end with one of [dDhHmMsS]",
- key, value));
- }
-
- long duration = Long.parseLong(value.substring(0, value.length() - 1));
- parseDuration(spec, duration, timeUnit);
- } catch (NumberFormatException e) {
- throw new IllegalArgumentException(
- String.format("key %s value set to %s, must be integer", key, value));
- }
- }
- }
-
- /** Parse expireAfterAccess */
- static class AccessDurationParser extends DurationParser {
- @Override protected void parseDuration(CacheBuilderSpec spec, long duration, TimeUnit unit) {
- checkArgument(spec.accessExpirationTimeUnit == null, "expireAfterAccess already set");
- spec.accessExpirationDuration = duration;
- spec.accessExpirationTimeUnit = unit;
- }
- }
-
- /** Parse expireAfterWrite */
- static class WriteDurationParser extends DurationParser {
- @Override protected void parseDuration(CacheBuilderSpec spec, long duration, TimeUnit unit) {
- checkArgument(spec.writeExpirationTimeUnit == null, "expireAfterWrite already set");
- spec.writeExpirationDuration = duration;
- spec.writeExpirationTimeUnit = unit;
- }
- }
-
- /** Parse refreshAfterWrite */
- static class RefreshDurationParser extends DurationParser {
- @Override protected void parseDuration(CacheBuilderSpec spec, long duration, TimeUnit unit) {
- checkArgument(spec.refreshTimeUnit == null, "refreshAfterWrite already set");
- spec.refreshDuration = duration;
- spec.refreshTimeUnit = unit;
- }
- }
-}