From 63128012244d05ba1d94cd83febb0faf354cfac4 Mon Sep 17 00:00:00 2001 From: crast Date: Sat, 16 Feb 2013 14:33:24 -0700 Subject: Refactor common metadata code into base class. Fixes BUKKIT-3624 Implementing the MetadataValue interface is significant work due to having to provide a large amount of conversion stub methods. This commit adds a new optional abstract base class to aid in implementation. --- .../org/bukkit/metadata/LazyMetadataValue.java | 61 +---------------- .../org/bukkit/metadata/MetadataValueAdapter.java | 77 ++++++++++++++++++++++ 2 files changed, 79 insertions(+), 59 deletions(-) create mode 100644 src/main/java/org/bukkit/metadata/MetadataValueAdapter.java (limited to 'src/main/java/org') diff --git a/src/main/java/org/bukkit/metadata/LazyMetadataValue.java b/src/main/java/org/bukkit/metadata/LazyMetadataValue.java index cc0ba506..57fdc502 100644 --- a/src/main/java/org/bukkit/metadata/LazyMetadataValue.java +++ b/src/main/java/org/bukkit/metadata/LazyMetadataValue.java @@ -5,7 +5,6 @@ import java.util.concurrent.Callable; import org.apache.commons.lang.Validate; import org.bukkit.plugin.Plugin; -import org.bukkit.util.NumberConversions; /** * The LazyMetadataValue class implements a type of metadata that is not computed until another plugin asks for it. @@ -14,11 +13,10 @@ import org.bukkit.util.NumberConversions; * or invalidated at the individual or plugin level. Once invalidated, the LazyMetadataValue will recompute its value * when asked. */ -public class LazyMetadataValue implements MetadataValue { +public class LazyMetadataValue extends MetadataValueAdapter implements MetadataValue { private Callable lazyValue; private CacheStrategy cacheStrategy; private SoftReference internalValue = new SoftReference(null); - private Plugin owningPlugin; private static final Object ACTUALLY_NULL = new Object(); /** @@ -39,19 +37,14 @@ public class LazyMetadataValue implements MetadataValue { * @param lazyValue the lazy value assigned to this metadata value. */ public LazyMetadataValue(Plugin owningPlugin, CacheStrategy cacheStrategy, Callable lazyValue) { - Validate.notNull(owningPlugin, "owningPlugin cannot be null"); + super(owningPlugin); Validate.notNull(cacheStrategy, "cacheStrategy cannot be null"); Validate.notNull(lazyValue, "lazyValue cannot be null"); this.lazyValue = lazyValue; - this.owningPlugin = owningPlugin; this.cacheStrategy = cacheStrategy; } - public Plugin getOwningPlugin() { - return owningPlugin; - } - public Object value() { eval(); Object value = internalValue.get(); @@ -61,56 +54,6 @@ public class LazyMetadataValue implements MetadataValue { return value; } - public int asInt() { - return NumberConversions.toInt(value()); - } - - public float asFloat() { - return NumberConversions.toFloat(value()); - } - - public double asDouble() { - return NumberConversions.toDouble(value()); - } - - public long asLong() { - return NumberConversions.toLong(value()); - } - - public short asShort() { - return NumberConversions.toShort(value()); - } - - public byte asByte() { - return NumberConversions.toByte(value()); - } - - public boolean asBoolean() { - Object value = value(); - if (value instanceof Boolean) { - return (Boolean) value; - } - - if (value instanceof Number) { - return ((Number) value).intValue() != 0; - } - - if (value instanceof String) { - return Boolean.parseBoolean((String) value); - } - - return value != null; - } - - public String asString() { - Object value = value(); - - if (value == null) { - return ""; - } - return value.toString(); - } - /** * Lazily evaluates the value of this metadata item. * diff --git a/src/main/java/org/bukkit/metadata/MetadataValueAdapter.java b/src/main/java/org/bukkit/metadata/MetadataValueAdapter.java new file mode 100644 index 00000000..c4b8b392 --- /dev/null +++ b/src/main/java/org/bukkit/metadata/MetadataValueAdapter.java @@ -0,0 +1,77 @@ +package org.bukkit.metadata; + +import org.apache.commons.lang.Validate; +import org.bukkit.plugin.Plugin; +import org.bukkit.util.NumberConversions; + +/** + * Optional base class for facilitating MetadataValue implementations. + * + * This provides all the conversion functions for MetadataValue + * so that writing an implementation of MetadataValue is as simple + * as implementing value() and invalidate(). + * + */ +public abstract class MetadataValueAdapter implements MetadataValue { + protected final Plugin owningPlugin; + + protected MetadataValueAdapter(Plugin owningPlugin) { + Validate.notNull(owningPlugin, "owningPlugin cannot be null"); + this.owningPlugin = owningPlugin; + } + + public Plugin getOwningPlugin() { + return owningPlugin; + } + + public int asInt() { + return NumberConversions.toInt(value()); + } + + public float asFloat() { + return NumberConversions.toFloat(value()); + } + + public double asDouble() { + return NumberConversions.toDouble(value()); + } + + public long asLong() { + return NumberConversions.toLong(value()); + } + + public short asShort() { + return NumberConversions.toShort(value()); + } + + public byte asByte() { + return NumberConversions.toByte(value()); + } + + public boolean asBoolean() { + Object value = value(); + if (value instanceof Boolean) { + return (Boolean) value; + } + + if (value instanceof Number) { + return ((Number) value).intValue() != 0; + } + + if (value instanceof String) { + return Boolean.parseBoolean((String) value); + } + + return value != null; + } + + public String asString() { + Object value = value(); + + if (value == null) { + return ""; + } + return value.toString(); + } + +} -- cgit v1.2.3