/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.foundation.wkf;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openflexo.foundation.utils.FlexoModelObjectReference;
import org.openflexo.foundation.validation.Validable;
import org.openflexo.foundation.wkf.MetricsDefinition.MetricsType;
import org.openflexo.foundation.xml.FlexoProcessBuilder;
import org.openflexo.inspector.InspectableObject;
import org.openflexo.logging.FlexoLogger;
import org.openflexo.toolbox.Duration;
import org.openflexo.xmlcode.StringRepresentable;
public class MetricsValue extends WKFObject implements InspectableObject, FlexoModelObjectReference.ReferenceOwner, StringRepresentable {
private static final Logger logger = FlexoLogger.getLogger(MetricsValue.class.getPackage().getName());
public static interface MetricsValueOwner {
public FlexoProcess getProcess();
public Vector<MetricsValue> getMetricsValues();
public void addToMetricsValues(MetricsValue value);
public void removeFromMetricsValues(MetricsValue value);
public void updateMetricsValues();
}
private FlexoModelObjectReference<MetricsDefinition> metricsDefinitionReference;
private String stringValue;
private Integer intValue;
private Duration durationValue;
private Boolean booleanValue;
private Double doubleValue;
private String unit;
private MetricsValueOwner owner;
public MetricsValue(FlexoProcess process) {
super(process);
}
public MetricsValue(FlexoProcessBuilder builder) {
this(builder.process);
}
@Override
public void delete() {
if (metricsDefinitionReference != null) {
metricsDefinitionReference.delete();
}
if (owner != null) {
owner.removeFromMetricsValues(this);
}
metricsDefinitionReference = null;
owner = null;
super.delete();
deleteObservers();
}
public boolean hasValue() {
if (getValue() == null) {
return false;
}
if (getMetricsDefinition() != null && getMetricsDefinition().getType() == MetricsType.TIME) {
return getDurationValue().isValid();
}
return true;
}
public Object getValue() {
if (getMetricsDefinition() != null) {
switch (getMetricsDefinition().getType()) {
case TEXT:
return getStringValue();
case NUMBER:
return getIntValue();
case DOUBLE:
return getDoubleValue();
case TIME:
return getDurationValue();
case TRUE_FALSE:
return getBooleanValue();
default:
break;
}
} else {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Metrics value has no definition");
}
}
return null;
}
public void setValue(Object value) {
Object old = getValue();
switch (getMetricsDefinition().getType()) {
case TEXT:
if (value instanceof String) {
setStringValue((String) value);
}
break;
case NUMBER:
if (value instanceof Integer) {
setIntValue((Integer) value);
}
break;
case DOUBLE:
if (value instanceof Double) {
setDoubleValue((Double) value);
}
break;
case TIME:
if (value instanceof Duration) {
setDurationValue((Duration) value);
}
break;
case TRUE_FALSE:
if (value instanceof Boolean) {
setBooleanValue((Boolean) value);
}
break;
default:
break;
}
setChanged();
notifyAttributeModification("value", old, value);
}
@Override
public Vector<Validable> getAllEmbeddedValidableObjects() {
Vector<Validable> v = new Vector<Validable>();
v.add(this);
return v;
}
public FlexoModelObjectReference<MetricsDefinition> getMetricsDefinitionReference() {
return metricsDefinitionReference;
}
public void setMetricsDefinitionReference(FlexoModelObjectReference<MetricsDefinition> objectReference) {
this.metricsDefinitionReference = objectReference;
if (this.metricsDefinitionReference != null) {
this.metricsDefinitionReference.setOwner(this);
}
}
public MetricsDefinition getMetricsDefinition() {
return getMetricsDefinition(true);
}
public MetricsDefinition getMetricsDefinition(boolean forceResourceLoad) {
if (getMetricsDefinitionReference() != null) {
return getMetricsDefinitionReference().getObject(forceResourceLoad);
} else {
return null;
}
}
public void setMetricsDefinition(MetricsDefinition object) {
if (metricsDefinitionReference != null) {
metricsDefinitionReference.delete(false);
metricsDefinitionReference = null;
}
if (object != null) {
metricsDefinitionReference = new FlexoModelObjectReference<MetricsDefinition>(object, this);
} else {
metricsDefinitionReference = null;
}
}
public MetricsValue getThis() {
return this;
}
public void setThis(MetricsValue value) {
// Little hack for inspector
}
@Override
public String getClassNameKey() {
return "metrics_value";
}
@Override
public String getFullyQualifiedName() {
return "METRICS_VALUE." + getName();
}
@Override
public Vector<? extends WKFObject> getAllEmbeddedDeleted() {
return getAllEmbeddedWKFObjects();
}
@Override
public Vector<? extends WKFObject> getAllEmbeddedWKFObjects() {
Vector<WKFObject> v = new Vector<WKFObject>();
v.add(this);
return v;
}
@Override
public String getInspectorName() {
return null;
}
@Override
public void notifyObjectLoaded(FlexoModelObjectReference reference) {
}
@Override
public void objectCantBeFound(FlexoModelObjectReference reference) {
}
@Override
public void objectDeleted(FlexoModelObjectReference reference) {
if (reference == metricsDefinitionReference) {
if (owner != null) {
owner.removeFromMetricsValues(this);
}
reference.delete(false);
}
}
public MetricsValueOwner getOwner() {
return owner;
}
public void setOwner(MetricsValueOwner owner) {
this.owner = owner;
}
public String getStringValue() {
return stringValue;
}
public void setStringValue(String stringValue) {
this.stringValue = stringValue;
setChanged();
notifyAttributeModification("stringValue", null, stringValue);
}
public Integer getIntValue() {
if (!isSerializing()) {
if (intValue == null && doubleValue != null) {
intValue = doubleValue.intValue();
}
}
return intValue;
}
public void setIntValue(Integer intValue) {
if (this.intValue == null && intValue != null) {
if (!isDeserializing() && getMetricsDefinition() != null) {
setUnit(getMetricsDefinition().getUnit());
}
}
this.intValue = intValue;
setChanged();
notifyAttributeModification("intValue", null, intValue);
}
public Double getDoubleValue() {
if (!isSerializing()) {
if (doubleValue == null && intValue != null) {
doubleValue = intValue.doubleValue();
}
}
return doubleValue;
}
public void setDoubleValue(Double doubleValue) {
if (this.doubleValue == null && doubleValue != null) {
if (!isDeserializing() && getMetricsDefinition() != null) {
setUnit(getMetricsDefinition().getUnit());
}
}
this.doubleValue = doubleValue;
setChanged();
notifyAttributeModification("doubleValue", null, doubleValue);
}
public Duration getDurationValue() {
return durationValue;
}
public void setDurationValue(Duration durationValue) {
this.durationValue = durationValue;
setChanged();
notifyAttributeModification("durationValue", null, durationValue);
}
public Boolean getBooleanValue() {
return booleanValue;
}
public void setBooleanValue(Boolean booleanValue) {
this.booleanValue = booleanValue;
setChanged();
notifyAttributeModification("booleanValue", null, booleanValue);
}
public String getUnit() {
if (!isSerializing()) {
if (getMetricsDefinition().getType().isUnitEditable()) {
if (unit == null) {
return getMetricsDefinition().getUnit();
} else {
return unit;
}
} else {
return null;
}
}
return unit;
}
public void setUnit(String unit) {
String old = unit;
this.unit = unit;
setChanged();
notifyAttributeModification("unit", old, unit);
}
@Override
public String toString() {
if (getValue() == null) {
return "";
}
switch (getMetricsDefinition().getType()) {
case NUMBER:
return getIntValue().toString() + getUnit() != null ? " " + getUnit() : "";
case DOUBLE:
return getDoubleValue().toString() + getUnit() != null ? " " + getUnit() : "";
case TEXT:
return getStringValue();
case TIME:
return getDurationValue().toString();
case TRUE_FALSE:
return getBooleanValue().toString();
default:
break;
}
return super.toString();
}
@Override
public void objectSerializationIdChanged(FlexoModelObjectReference reference) {
setChanged();
}
}