/*
* Initial version copyright 2008 Lockheed Martin Corporation, except
* as stated in the file entitled Licensing-Information.
*
* All modifications copyright 2009-2015 Data Access Technologies, Inc.
*
* Licensed under the Academic Free License version 3.0
* (http://www.opensource.org/licenses/afl-3.0.php), except as stated
* in the file entitled Licensing-Information.
*/
package fUML.Semantics.Classes.Kernel;
import fUML.Debug;
import UMLPrimitiveTypes.*;
import fUML.Syntax.*;
import fUML.Syntax.Classes.Kernel.*;
import fUML.Semantics.*;
import fUML.Semantics.Loci.*;
public abstract class CompoundValue extends
fUML.Semantics.Classes.Kernel.StructuredValue {
public fUML.Semantics.Classes.Kernel.FeatureValueList featureValues = new fUML.Semantics.Classes.Kernel.FeatureValueList();
public boolean equals(fUML.Semantics.Classes.Kernel.Value otherValue) {
// Test if this data value is equal to the otherValue.
// To be equal, the otherValue must also be a compund value with the
// same types and equal values for each feature.
// Debug.println("[equals] othervalue instanceof CompoundValue = " + (otherValue instanceof CompoundValue));
// Debug.println("[equals] super.equals(otherValue) = " + super.equals(otherValue));
boolean isEqual = otherValue instanceof CompoundValue;
if (isEqual) {
CompoundValue otherCompoundValue = (CompoundValue) otherValue;
// Debug.println("[equals] " + this.featureValues.size() +
// " feature(s).");
isEqual = super.equals(otherValue)
& otherCompoundValue.featureValues.size() == this.featureValues
.size();
int i = 1;
while (isEqual & i <= this.featureValues.size()) {
FeatureValue thisFeatureValue = this.featureValues
.getValue(i - 1);
boolean matched = false;
int j = 1;
while (!matched & j <= otherCompoundValue.featureValues.size()) {
FeatureValue otherFeatureValue = otherCompoundValue.featureValues
.getValue(j - 1);
if (thisFeatureValue.feature == otherFeatureValue.feature) {
matched = thisFeatureValue
.hasEqualValues(otherFeatureValue);
}
j = j + 1;
}
isEqual = matched;
i = i + 1;
}
}
return isEqual;
} // equals
public fUML.Semantics.Classes.Kernel.Value copy() {
// Create a new data value with the same featureValues as this data
// value.
CompoundValue newValue = (CompoundValue) (super.copy());
FeatureValueList featureValues = this.featureValues;
for (int i = 0; i < featureValues.size(); i++) {
FeatureValue featureValue = featureValues.getValue(i);
newValue.featureValues.addValue(featureValue.copy());
}
return newValue;
} // copy
public fUML.Semantics.Classes.Kernel.FeatureValue getFeatureValue(
fUML.Syntax.Classes.Kernel.StructuralFeature feature) {
// Get the value(s) of the member of featureValues for the given
// feature.
FeatureValue featureValue = null;
int i = 1;
while (featureValue == null & i <= this.featureValues.size()) {
if (this.featureValues.getValue(i - 1).feature == feature) {
featureValue = this.featureValues.getValue(i - 1);
}
i = i + 1;
}
return featureValue;
} // getFeatureValue
public void setFeatureValue(
fUML.Syntax.Classes.Kernel.StructuralFeature feature,
fUML.Semantics.Classes.Kernel.ValueList values, int position) {
// Set the value(s) of the member of featureValues for the given
// feature.
FeatureValue featureValue = this.getFeatureValue(feature);
if (featureValue == null) {
featureValue = new FeatureValue();
this.featureValues.addValue(featureValue);
}
featureValue.feature = feature;
featureValue.values = values;
featureValue.position = position;
} // setFeatureValue
public fUML.Semantics.Classes.Kernel.FeatureValueList getFeatureValues() {
// Return the feature values for this compound value.
return this.featureValues;
} // getFeatureValues
public String toString() {
String buffer = "(";
ClassifierList types = this.getTypes();
int i = 1;
while (i <= types.size()) {
if (i != 1) {
buffer = buffer + " ";
}
buffer = buffer + types.getValue(i - 1).name;
i = i + 1;
}
int k = 1;
while (k <= this.featureValues.size()) {
FeatureValue featureValue = this.featureValues.getValue(k - 1);
buffer = buffer + "\n\t\t" + featureValue.feature.name + "["
+ featureValue.position + "] =";
int j = 1;
while (j <= featureValue.values.size()) {
Value value = featureValue.values.getValue(j - 1);
if (value instanceof Reference) {
Object_ object = ((Reference)value).referent;
buffer = buffer + " Reference to " + object.identifier + "(";
types = object.getTypes();
int n = 1;
while (n <= types.size()) {
if (n != 1) {
buffer = buffer + " ";
}
buffer = buffer + types.getValue(n - 1).name;
n = n + 1;
}
buffer = buffer + ")";
} else {
buffer = buffer + " " + value.toString();
}
j = j + 1;
}
k = k + 1;
}
return buffer + ")";
} // toString
} // CompoundValue