001 /*
002 @license.text@
003 */
004 package biz.hammurapi.config;
005
006 import biz.hammurapi.metrics.MeasurementCollector;
007 import biz.hammurapi.metrics.MeasurementConsumer;
008
009 /**
010 * Base class for components. Implements some standard functions.
011 * Measurement collection is delegated if measurement consumer is set.
012 * @author Pavel Vlasov
013 * @revision $Revision$
014 */
015 public abstract class ComponentBase implements Component, Context, MeasurementConsumer, MeasurementCollector {
016
017 protected Object owner;
018
019 private PathNavigator pathNavigator=new PathNavigator(this) {
020
021 protected Object getParent() {
022 return owner;
023 }
024
025 protected Object getChild(String name) {
026 return ComponentBase.this.getChild(name);
027 }
028
029 };
030
031 /**
032 * Override this method if component has subcomponents.
033 * @param name
034 * @return
035 */
036 protected Object getChild(String name) {
037 return null;
038 }
039
040 public void setOwner(Object owner) {
041 this.owner=owner;
042 }
043
044 public Object get(String name) {
045 return pathNavigator.get(name);
046 }
047
048 private MeasurementConsumer measurementConsumer;
049
050 public void setMeasurementConsumer(MeasurementConsumer measurementConsumer) {
051 this.measurementConsumer = measurementConsumer;
052 if (measurementConsumer instanceof Component) {
053 ((Component) getMeasurementConsumer()).setOwner(this);
054 }
055 }
056
057 public MeasurementConsumer getMeasurementConsumer() {
058 return measurementConsumer;
059 }
060
061 public void addMeasurement(String name, double value, long time) {
062 if (measurementConsumer!=null) {
063 measurementConsumer.addMeasurement(name, value, time==0 ? System.currentTimeMillis() : time);
064 }
065 }
066
067 /**
068 * Finds component owner of particular type.
069 * @param ownerType
070 * @return Owner which is an instance of specified type or null if no such owner is found.
071 */
072 public Object getOwner(Class ownerType) {
073 if (owner==null || ownerType.isInstance(owner)) {
074 return owner;
075 }
076
077 if (owner instanceof ComponentBase) {
078 return ((ComponentBase) owner).getOwner(ownerType);
079 }
080
081 if (owner instanceof GenericContainer) {
082 return ((GenericContainer) owner).getOwner(ownerType);
083 }
084
085 return null;
086 }
087 }