Override some Object methods.
[demoscenemusic.git] / src / main / java / net / pterodactylus / demoscenemusic / data / AbstractBase.java
index 6a21081..ad5cfd8 100644 (file)
@@ -19,13 +19,14 @@ package net.pterodactylus.demoscenemusic.data;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Map.Entry;
 
 /**
  * TODO
  *
  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
  */
-public class AbstractBase {
+public abstract class AbstractBase implements Base {
 
        private final String id;
 
@@ -47,6 +48,53 @@ public class AbstractBase {
                return (Value<T>) attributes.get(name);
        }
 
+       protected boolean dirty() {
+               for (Value<?> value : attributes.values()) {
+                       if (value.dirty()) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       //
+       // OBJECT METHODS
+       //
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public int hashCode() {
+               return id().hashCode();
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public boolean equals(Object obj) {
+               if (!(obj instanceof Base)) {
+                       return false;
+               }
+               return id().equals(((Base) obj).id());
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public String toString() {
+               StringBuilder stringBuilder = new StringBuilder();
+               stringBuilder.append(getClass().getName());
+               stringBuilder.append('[').append("id=").append(id());
+               for (Entry<String, Value<?>> attributeEntry : attributes.entrySet()) {
+                       stringBuilder.append(',').append(attributeEntry.getKey()).append('=').append(attributeEntry.getValue().get());
+               }
+               stringBuilder.append(']');
+               return stringBuilder.toString();
+       }
+
        protected static class Value<T> {
 
                private T original;