@Override public CaffeineSpec deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { final String text = jp.getText(); if ("off".equalsIgnoreCase(text) || "disabled".equalsIgnoreCase(text)) { return CaffeineSpec.parse("initialCapacity=0,maximumSize=0"); } return CaffeineSpec.parse(text); } }
@Override public void serialize(CaffeineSpec value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(value.toParsableString()); } }
/** * Creates a CaffeineSpec from a string. * * @param specification the string form * @return the parsed specification */ @SuppressWarnings("StringSplitter") public static @NonNull CaffeineSpec parse(@NonNull String specification) { CaffeineSpec spec = new CaffeineSpec(specification); for (String option : specification.split(SPLIT_OPTIONS)) { spec.parseOption(option.trim()); } return spec; }
switch (key) { case "initialCapacity": initialCapacity(key, value); return; case "maximumSize": maximumSize(key, value); return; case "maximumWeight": maximumWeight(key, value); return; case "weakKeys": weakKeys(value); return; case "weakValues": valueStrength(key, value, Strength.WEAK); return; case "softValues": valueStrength(key, value, Strength.SOFT); return; case "expireAfterAccess": expireAfterAccess(key, value); return; case "expireAfterWrite": expireAfterWrite(key, value); return; case "refreshAfterWrite": refreshAfterWrite(key, value); return; case "recordStats":
@Test(dataProvider = "caches") @CacheSpec(initialCapacity = {InitialCapacity.DEFAULT, InitialCapacity.FULL}, population = Population.EMPTY, compute = Compute.SYNC, writer = Writer.DISABLED, removalListener = Listener.DEFAULT, implementation = Implementation.Caffeine) public void specifications(CacheContext context) { CaffeineSpec spec = toSpec(context); Caffeine<Object, Object> builder = Caffeine.from(spec); checkInitialCapacity(spec, context, builder); checkMaximumWeight(spec, context, builder); checkMaximumSize(spec, context, builder); checkWeakKeys(spec, context, builder); checkValueStrength(spec, context, builder); checkExpireAfterAccess(spec, context, builder); checkExpireAfterWrite(spec, context, builder); checkRefreshAfterWrite(spec, context, builder); assertThat(spec, is(equalTo(CaffeineSpec.parse(spec.toParsableString())))); }
@Override public int hashCode() { return Objects.hash( initialCapacity, maximumSize, maximumWeight, keyStrength, valueStrength, recordStats, durationInNanos(expireAfterAccessDuration, expireAfterAccessTimeUnit), durationInNanos(expireAfterWriteDuration, expireAfterWriteTimeUnit), durationInNanos(refreshAfterWriteDuration, refreshAfterWriteTimeUnit)); }
/** Parses and applies the configuration option. */ void parseOption(String option) { if (option.isEmpty()) { return; } @SuppressWarnings("StringSplitter") String[] keyAndValue = option.split(SPLIT_KEY_VALUE); requireArgument(keyAndValue.length <= 2, "key-value pair %s with more than one equals sign", option); String key = keyAndValue[0].trim(); String value = (keyAndValue.length == 1) ? null : keyAndValue[1].trim(); configure(key, value); }
switch (key) { case "initialCapacity": initialCapacity(key, value); return; case "maximumSize": maximumSize(key, value); return; case "maximumWeight": maximumWeight(key, value); return; case "weakKeys": weakKeys(value); return; case "weakValues": valueStrength(key, value, Strength.WEAK); return; case "softValues": valueStrength(key, value, Strength.SOFT); return; case "expireAfterAccess": expireAfterAccess(key, value); return; case "expireAfterWrite": expireAfterWrite(key, value); return; case "refreshAfterWrite": refreshAfterWrite(key, value); return; case "recordStats":
@Override public boolean equals(Object o) { if (this == o) { return true; } else if (!(o instanceof CaffeineSpec)) { return false; } CaffeineSpec spec = (CaffeineSpec) o; return Objects.equals(initialCapacity, spec.initialCapacity) && Objects.equals(maximumSize, spec.maximumSize) && Objects.equals(maximumWeight, spec.maximumWeight) && Objects.equals(keyStrength, spec.keyStrength) && Objects.equals(valueStrength, spec.valueStrength) && Objects.equals(recordStats, spec.recordStats) && (durationInNanos(expireAfterAccessDuration, expireAfterAccessTimeUnit) == durationInNanos(spec.expireAfterAccessDuration, spec.expireAfterAccessTimeUnit)) && (durationInNanos(expireAfterWriteDuration, expireAfterWriteTimeUnit) == durationInNanos(spec.expireAfterWriteDuration, spec.expireAfterWriteTimeUnit)) && (durationInNanos(refreshAfterWriteDuration, refreshAfterWriteTimeUnit) == durationInNanos(spec.refreshAfterWriteDuration, spec.refreshAfterWriteTimeUnit)); }
/** Parses and applies the configuration option. */ void parseOption(String option) { if (option.isEmpty()) { return; } @SuppressWarnings("StringSplitter") String[] keyAndValue = option.split(SPLIT_KEY_VALUE); requireArgument(keyAndValue.length <= 2, "key-value pair %s with more than one equals sign", option); String key = keyAndValue[0].trim(); String value = (keyAndValue.length == 1) ? null : keyAndValue[1].trim(); configure(key, value); }
private static Optional<String> caffeineSpec(String name, String defaultValue) { final String spec = get(name, defaultValue, value -> { try { if (!"off".equals(value)) { CaffeineSpec.parse(value); } return true; } catch (Exception e) { return false; } }); return "off".equals(spec) ? Optional.empty() : Optional.of(spec); }
/** * Returns a string representation for this {@code CaffeineSpec} instance. The form of this * representation is not guaranteed. */ @Override public String toString() { return getClass().getSimpleName() + '{' + toParsableString() + '}'; } }
/** * Creates a CaffeineSpec from a string. * * @param specification the string form * @return the parsed specification */ @SuppressWarnings("StringSplitter") public static CaffeineSpec parse(String specification) { CaffeineSpec spec = new CaffeineSpec(specification); for (String option : specification.split(SPLIT_OPTIONS)) { spec.parseOption(option.trim()); } return spec; }
@Override public int hashCode() { return Objects.hash( initialCapacity, maximumSize, maximumWeight, keyStrength, valueStrength, recordStats, durationInNanos(expireAfterAccessDuration, expireAfterAccessTimeUnit), durationInNanos(expireAfterWriteDuration, expireAfterWriteTimeUnit), durationInNanos(refreshAfterWriteDuration, refreshAfterWriteTimeUnit)); }
/** * Constructs a new {@code Caffeine} instance with the settings specified in {@code spec}. * * @param spec a String in the format specified by {@link CaffeineSpec} * @return a new instance with the specification's settings */ @NonNull public static Caffeine<Object, Object> from(String spec) { return from(CaffeineSpec.parse(spec)); }
/** * Returns a string representation for this {@code CaffeineSpec} instance. The form of this * representation is not guaranteed. */ @Override public String toString() { return getClass().getSimpleName() + '{' + toParsableString() + '}'; } }
@Override public boolean equals(Object o) { if (this == o) { return true; } else if (!(o instanceof CaffeineSpec)) { return false; } CaffeineSpec spec = (CaffeineSpec) o; return Objects.equals(initialCapacity, spec.initialCapacity) && Objects.equals(maximumSize, spec.maximumSize) && Objects.equals(maximumWeight, spec.maximumWeight) && Objects.equals(keyStrength, spec.keyStrength) && Objects.equals(valueStrength, spec.valueStrength) && Objects.equals(recordStats, spec.recordStats) && (durationInNanos(expireAfterAccessDuration, expireAfterAccessTimeUnit) == durationInNanos(spec.expireAfterAccessDuration, spec.expireAfterAccessTimeUnit)) && (durationInNanos(expireAfterWriteDuration, expireAfterWriteTimeUnit) == durationInNanos(spec.expireAfterWriteDuration, spec.expireAfterWriteTimeUnit)) && (durationInNanos(refreshAfterWriteDuration, refreshAfterWriteTimeUnit) == durationInNanos(spec.refreshAfterWriteDuration, spec.refreshAfterWriteTimeUnit)); }
public void testParse_maximumWeightRepeated() { try { parse("maximumWeight=10, maximumWeight=20"); fail("Expected exception"); } catch (IllegalArgumentException expected) { // expected } }
public void testParse_weakValuesCannotHaveValue() { try { parse("weakValues=true"); fail("Expected exception"); } catch (IllegalArgumentException expected) { // expected } }
public void testParse_recordStatsValueSpecified() { try { parse("recordStats=True"); fail("Expected exception"); } catch (IllegalArgumentException expected) { // expected } }