Move event and metadata handling into abstract base class.
[sonitus.git] / src / main / java / net / pterodactylus / sonitus / data / AbstractControlledComponent.java
index 2c63a08..15740ad 100644 (file)
@@ -18,6 +18,7 @@
 package net.pterodactylus.sonitus.data;
 
 import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
 
 import com.google.common.collect.Lists;
 
@@ -29,8 +30,24 @@ import com.google.common.collect.Lists;
  */
 public abstract class AbstractControlledComponent implements ControlledComponent {
 
+       /** The name of this filter. */
+       private final String name;
+
        /** The list of metadata listeners. */
-       private final List<MetadataListener> metadataListeners = Lists.newArrayList();
+       private final List<MetadataListener> metadataListeners = Lists.newCopyOnWriteArrayList();
+
+       /** The current metadata. */
+       private AtomicReference<Metadata> metadata = new AtomicReference<Metadata>();
+
+       /**
+        * Creates a new abstract controlled component.
+        *
+        * @param name
+        *              The name of the component
+        */
+       protected AbstractControlledComponent(String name) {
+               this.name = name;
+       }
 
        //
        // LISTENER MANAGEMENT
@@ -47,6 +64,29 @@ public abstract class AbstractControlledComponent implements ControlledComponent
        }
 
        //
+       // CONTROLLEDCOMPONENT METHODS
+       //
+
+       @Override
+       public String name() {
+               return name;
+       }
+
+       @Override
+       public Metadata metadata() {
+               return metadata.get();
+       }
+
+       @Override
+       public void metadataUpdated(Metadata metadata) {
+               if (metadata.equals(this.metadata.get())) {
+                       return;
+               }
+               this.metadata.set(metadata);
+               fireMetadataUpdated(metadata);
+       }
+
+       //
        // EVENT METHODS
        //