/*
* Initial version copyright 2008 Lockheed Martin Corporation, except
* as stated in the file entitled Licensing-Information.
*
* All modifications copyright 2009-2017 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 fUML.Syntax.Classes.Kernel.*;
import fUML.Semantics.CommonBehaviors.Communications.*;
public class Object_ extends fUML.Semantics.Classes.Kernel.ExtensionalValue {
public fUML.Syntax.Classes.Kernel.Class_List types = new fUML.Syntax.Classes.Kernel.Class_List();
public fUML.Semantics.CommonBehaviors.Communications.ObjectActivation objectActivation = null;
public void startBehavior(
fUML.Syntax.Classes.Kernel.Class_ classifier,
fUML.Semantics.CommonBehaviors.BasicBehaviors.ParameterValueList inputs) {
// Create an object activation for this object (if one does not already
// exist) and start its behavior(s).
// Debug.println("[startBehavior] On object...");
if (this.objectActivation == null) {
this.objectActivation = new ObjectActivation();
this.objectActivation.object = this;
}
// Debug.println("[startBehavior] objectActivation = " +
// objectActivation);
this.objectActivation.startBehavior(classifier, inputs);
} // startBehavior
public fUML.Semantics.CommonBehaviors.BasicBehaviors.Execution dispatch(
fUML.Syntax.Classes.Kernel.Operation operation) {
// Dispatch the given operation to a method execution, using a dispatch
// strategy.
return ((DispatchStrategy) this.locus.factory.getStrategy("dispatch"))
.dispatch(this, operation);
} // dispatch
public void send(
fUML.Semantics.CommonBehaviors.Communications.EventOccurrence eventOccurrence) {
// If the object is active, add the given event occurrence to the event
// pool and signal that a new event occurrence has arrived.
if (this.objectActivation != null) {
this.objectActivation.send(eventOccurrence);
}
} // send
public void destroy() {
// Stop the object activation (if any), clear all types and destroy the
// object as an extensional value.
Debug.println("[destroy] object = " + this.identifier);
if (this.objectActivation != null) {
this.objectActivation.stop();
this.objectActivation = null;
}
this.types.clear();
super.destroy();
} // destroy
public void register(
fUML.Semantics.CommonBehaviors.Communications.EventAccepter accepter) {
// Register the given accept event accepter to wait for a dispatched
// signal event.
if (this.objectActivation != null) {
this.objectActivation.register(accepter);
}
} // register
public void unregister(
fUML.Semantics.CommonBehaviors.Communications.EventAccepter accepter) {
// Remove the given event accepter for the list of waiting event
// accepters.
if (this.objectActivation != null) {
this.objectActivation.unregister(accepter);
}
} // unregister
public fUML.Semantics.Classes.Kernel.Value copy() {
// Create a new object that is a copy of this object at the same locus
// as this object.
// However, the new object will NOT have any object activation (i.e, its
// classifier behaviors will not be started).
Object_ newObject = (Object_) (super.copy());
Class_List types = this.types;
for (int i = 0; i < types.size(); i++) {
Class_ type = types.getValue(i);
newObject.types.addValue(type);
}
return newObject;
} // copy
public boolean equals(Value otherValue) {
// Test if this object is equal to the otherValue.
// To be equal, the otherValue must be the same object as this object.
return this == otherValue;
} // equals
protected fUML.Semantics.Classes.Kernel.Value new_() {
// Create a new object with no type, feature values or locus.
return new Object_();
} // new_
public fUML.Syntax.Classes.Kernel.ClassifierList getTypes() {
// Return the types of this object.
ClassifierList types = new ClassifierList();
Class_List myTypes = this.types;
for (int i = 0; i < myTypes.size(); i++) {
Class_ type = myTypes.getValue(i);
types.addValue(type);
}
return types;
} // getTypes
} // Object