ptolemy.actor.parameters
Class PortParameter

java.lang.Object
  extended by ptolemy.kernel.util.NamedObj
      extended by ptolemy.kernel.util.Attribute
          extended by ptolemy.kernel.util.AbstractSettableAttribute
              extended by ptolemy.data.expr.Variable
                  extended by ptolemy.data.expr.Parameter
                      extended by ptolemy.actor.parameters.PortParameter
All Implemented Interfaces:
java.io.Serializable, java.lang.Cloneable, HasTypeConstraints, Typeable, Changeable, Debuggable, DebugListener, Derivable, ModelErrorHandler, MoMLExportable, Moveable, Nameable, Settable, ValueListener
Direct Known Subclasses:
FilePortParameter

public class PortParameter
extends Parameter

This parameter creates an associated port that can be used to update the current value of the parameter. This parameter has two values, which may not be equal, a current value and a persistent value. The persistent value is returned by getExpression() and is set by any of three different mechanisms:

All three of these will also set the current value, which is then equal to the persistent value. The current value is returned by get getToken() and is set by any of two different mechanisms:

These two techniques do not change the persistent value, so after these are used, the persistent value and current value may be different.

When using this parameter in an actor, care must be exercised to call update() exactly once per firing prior to calling getToken(). Each time update() is called, a new token will be consumed from the associated port (if the port is connected and has a token). If this is called multiple times in an iteration, it may result in consuming tokens that were intended for subsequent iterations. Thus, for example, update() should not be called in fire() and then again in postfire(). Moreover, in some domains (such as DE), it is essential that if a token is provided on a port, that it is consumed. In DE, the actor will be repeatedly fired until the token is consumed. Thus, it is an error to not call update() once per iteration. For an example of an actor that uses this mechanism, see Ramp.

If this actor is placed in a container that does not implement the TypedActor interface, then no associated port is created, and it functions as an ordinary parameter. This is useful, for example, if this is put in a library, where one would not want the associated port to appear.

There are a few situations where PortParameter might not do what you expect:

  1. If it is used in a transparent composite actor, then a token provided to a PortParameter will never be read. A transparent composite actor is one without a director.
    Workaround: Put a director in the composite.
  2. Certain actors (such as the Integrator in CT) read parameter values only during initialization. During initialization, a PortParameter can only have a value set via the parameter (it can't have yet received a token). So if the initial value of the Integrator is set to the value of the PortParameter, then it will see only the parameter value, never the value provided via the port.
    Workaround: Use a RunCompositeActor to contain the model with the Integrator.

Since:
Ptolemy II 3.0
Version:
$Id: PortParameter.java 57040 2010-01-27 20:52:32Z cxh $
Author:
Edward A. Lee
See Also:
Ramp, ParameterPort, Serialized Form
Accepted Rating:
Yellow (neuendor)
Proposed Rating:
Green (eal)

Nested Class Summary
 
Nested classes/interfaces inherited from class ptolemy.data.expr.Variable
Variable.VariableScope
 
Nested classes/interfaces inherited from class ptolemy.kernel.util.NamedObj
NamedObj.ContainedObjectsIterator
 
Nested classes/interfaces inherited from interface ptolemy.kernel.util.Settable
Settable.Visibility
 
Field Summary
protected  ParameterPort _port
          The associated port.
private  boolean _settingName
           
 
Fields inherited from class ptolemy.data.expr.Variable
_currentExpression, _needsEvaluation, _parserScope, _parseTreeValid, _valueListeners
 
Fields inherited from class ptolemy.kernel.util.NamedObj
_changeListeners, _changeLock, _changeRequests, _debugging, _debugListeners, _elementName, _isPersistent, _verbose, _workspace, ATTRIBUTES, CLASSNAME, COMPLETE, CONTENTS, DEEP, FULLNAME, LINKS
 
Fields inherited from interface ptolemy.kernel.util.Settable
EXPERT, FULL, NONE, NOT_EDITABLE
 
Constructor Summary
PortParameter(NamedObj container, java.lang.String name)
          Construct a parameter with the given name contained by the specified entity.
PortParameter(NamedObj container, java.lang.String name, Token token)
          Construct a Parameter with the given container, name, and Token.
 
Method Summary
 void attributeChanged(Attribute attribute)
          React to a change in an attribute.
 java.lang.Object clone(Workspace workspace)
          Clone the parameter.
 ParameterPort getPort()
          Return the associated port.
 void setContainer(Entity entity)
          Set the container of this parameter.
 void setCurrentValue(Token token)
          Set the current value of this parameter and notify the container and value listeners.
 void setDisplayName(java.lang.String name)
          Set the display name, and propagate the name change to the associated port.
 void setName(java.lang.String name)
          Set or change the name, and propagate the name change to the associated port.
 void update()
          Check to see whether a token has arrived at the associated port, and if so, update the current value of parameter with that token.
 
Methods inherited from class ptolemy.data.expr.Parameter
addChoice, exportMoML, getChoices, removeAllChoices, removeChoice
 
Methods inherited from class ptolemy.data.expr.Variable
_description, _evaluate, _notifyValueListeners, _parseIfNecessary, _propagate, _propagateToValueListeners, _propagateValue, _setToken, _setTokenAndNotify, addValueListener, getDeclaredType, getExpression, getFreeIdentifiers, getParserScope, getScope, getScope, getToken, getType, getTypeTerm, getValueAsString, getVariable, getVisibility, invalidate, isKnown, isLazy, isStringMode, isTypeAcceptable, removeValueListener, reset, setContainer, setExpression, setLazy, setParseTreeEvaluator, setStringMode, setToken, setToken, setTypeAtLeast, setTypeAtLeast, setTypeAtMost, setTypeEquals, setTypeSameAs, setUnknown, setVisibility, stringRepresentation, toString, typeConstraintList, typeConstraints, validate, valueChanged
 
Methods inherited from class ptolemy.kernel.util.AbstractSettableAttribute
getDefaultExpression
 
Methods inherited from class ptolemy.kernel.util.Attribute
_checkContainer, _getContainedObject, _propagateExistence, getContainer, moveDown, moveToFirst, moveToIndex, moveToLast, moveUp, updateContent
 
Methods inherited from class ptolemy.kernel.util.NamedObj
_addAttribute, _adjustOverride, _attachText, _cloneFixAttributeFields, _debug, _debug, _debug, _debug, _debug, _exportMoMLContents, _getIndentPrefix, _isMoMLSuppressed, _markContentsDerived, _recordDecoratedAttributes, _removeAttribute, _splitName, _stripNumericSuffix, _validateSettables, addChangeListener, addDebugListener, attributeList, attributeList, attributeTypeChanged, clone, containedObjectsIterator, deepContains, depthInHierarchy, description, description, event, executeChangeRequests, exportMoML, exportMoML, exportMoML, exportMoML, exportMoMLPlain, getAttribute, getAttribute, getAttributes, getChangeListeners, getClassName, getDecoratorAttribute, getDecoratorAttributes, getDerivedLevel, getDerivedList, getDisplayName, getElementName, getFullName, getModelErrorHandler, getName, getName, getPrototypeList, getSource, handleModelError, isDeferringChangeRequests, isOverridden, isPersistent, lazyContainedObjectsIterator, message, propagateExistence, propagateValue, propagateValues, removeChangeListener, removeDebugListener, requestChange, setClassName, setDeferringChangeRequests, setDerivedLevel, setModelErrorHandler, setPersistent, setSource, sortContainedObjects, toplevel, uniqueName, validateSettables, workspace
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface ptolemy.kernel.util.Settable
getDisplayName
 
Methods inherited from interface ptolemy.kernel.util.Nameable
description, getContainer, getFullName, getName, getName
 

Field Detail

_port

protected ParameterPort _port
The associated port.


_settingName

private boolean _settingName
Constructor Detail

PortParameter

public PortParameter(NamedObj container,
                     java.lang.String name)
              throws IllegalActionException,
                     NameDuplicationException
Construct a parameter with the given name contained by the specified entity. The container argument must not be null, or a NullPointerException will be thrown. This parameter will create an associated port in the same container.

Parameters:
container - The container.
name - The name of the parameter.
Throws:
IllegalActionException - If the parameter is not of an acceptable class for the container.
NameDuplicationException - If the name coincides with a parameter already in the container.

PortParameter

public PortParameter(NamedObj container,
                     java.lang.String name,
                     Token token)
              throws IllegalActionException,
                     NameDuplicationException
Construct a Parameter with the given container, name, and Token. The token defines the initial persistent and current values. The container argument must not be null, or a NullPointerException will be thrown. This parameter will use the workspace of the container for synchronization and version counts. If the name argument is null, then the name is set to the empty string. The object is not added to the list of objects in the workspace unless the container is null. Increment the version of the workspace. If the name argument is null, then the name is set to the empty string.

Parameters:
container - The container.
name - The name.
token - The Token contained by this Parameter.
Throws:
IllegalActionException - If the parameter is not of an acceptable class for the container.
NameDuplicationException - If the name coincides with an parameter already in the container.
Method Detail

attributeChanged

public void attributeChanged(Attribute attribute)
                      throws IllegalActionException
React to a change in an attribute. This method is called by a contained attribute when its value changes. In this class, if the attribute is an instance of Location, then the location of the associated port is set as well.

Overrides:
attributeChanged in class NamedObj
Parameters:
attribute - The attribute that changed.
Throws:
IllegalActionException - If the change is not acceptable to this container (not thrown in this base class).

getPort

public ParameterPort getPort()
Return the associated port. Normally, there always is one, but if setContainer() is called to change the container, then this might return null. Also, during cloning, there is a transient during which this may return null.

Returns:
The associated port.

clone

public java.lang.Object clone(Workspace workspace)
                       throws java.lang.CloneNotSupportedException
Clone the parameter. This overrides the base class to remove the current association with a port. It is assumed that the port will also be cloned, and when the containers are set of this parameter and that port, whichever one is set second will result in re-establishment of the association.

Overrides:
clone in class Variable
Parameters:
workspace - The workspace in which to place the cloned parameter.
Returns:
The cloned parameter.
Throws:
java.lang.CloneNotSupportedException - Not thrown in this base class.
See Also:
Object.clone()

setContainer

public void setContainer(Entity entity)
                  throws IllegalActionException,
                         NameDuplicationException
Set the container of this parameter. If the container is different from what it was before and there is an associated port, then break the association. If the new container has a port with the same name as this parameter, then establish a new association. That port must be an instance of ParameterPort, or no association is created.

Parameters:
entity - The new container.
Throws:
IllegalActionException - If the superclass throws it.
NameDuplicationException - If the superclass throws it.
See Also:
ParameterPort

setCurrentValue

public void setCurrentValue(Token token)
                     throws IllegalActionException
Set the current value of this parameter and notify the container and value listeners. This does not change the persistent value (returned by getExpression()), but does change the current value (returned by getToken()).

If the type of this variable has been set with setTypeEquals(), then convert the specified token into that type, if possible, or throw an exception, if not. If setTypeAtMost() has been called, then verify that its type constraint is satisfied, and if not, throw an exception. Note that you can call this with a null argument regardless of type constraints, unless there are other variables that depend on its value.

Parameters:
token - The new token to be stored in this variable.
Throws:
IllegalActionException - If the token type is not compatible with specified constraints, or if you are attempting to set to null a variable that has value dependents, or if the container rejects the change.

setDisplayName

public void setDisplayName(java.lang.String name)
Set the display name, and propagate the name change to the associated port. Increment the version of the workspace. This method is write-synchronized on the workspace.

Overrides:
setDisplayName in class NamedObj
Parameters:
name - The new display name.
Throws:
IllegalActionException - If the name contains a period.
NameDuplicationException - If the container already contains an attribute with the proposed name.
See Also:
NamedObj.getDisplayName()

setName

public void setName(java.lang.String name)
             throws IllegalActionException,
                    NameDuplicationException
Set or change the name, and propagate the name change to the associated port. If a null argument is given, then the name is set to an empty string. Increment the version of the workspace. This method is write-synchronized on the workspace.

Specified by:
setName in interface Nameable
Overrides:
setName in class Variable
Parameters:
name - The new name.
Throws:
IllegalActionException - If the name contains a period.
NameDuplicationException - If the container already contains an attribute with the proposed name.
See Also:
NamedObj.getName(), NamedObj.getName(NamedObj)

update

public void update()
            throws IllegalActionException
Check to see whether a token has arrived at the associated port, and if so, update the current value of parameter with that token. If there is no associated port, do nothing.

Throws:
IllegalActionException - If reading from the associated port throws it.