/**************************************************************************** ** ** Copyright (C) 2013 Sandro S. Andrade ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtUml module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qumlbehavior.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE /*! \class QUmlBehavior \inmodule QtUml \brief Behavior is a specification of how its context classifier changes state over time. This specification may be either a definition of possible behavior execution or emergent behavior, or a selective illustration of an interesting subset of possible executions. The latter form is typically used for capturing examples, such as a trace of a particular execution.A behavior owns zero or more parameter sets. \b {QUmlBehavior is an abstract class.} */ /*! Creates a new QUmlBehavior. */ QUmlBehavior::QUmlBehavior() : QUmlClass(false), _isReentrant(true), _specification(0) { } /*! Destroys the QUmlBehavior. */ QUmlBehavior::~QUmlBehavior() { QModelingElement::deleteQModelingObject(); } /*! Returns a deep-copied clone of the QUmlBehavior. */ QModelingElement *QUmlBehavior::clone() const { QUmlBehavior *c = new QUmlBehavior; c->asQModelingObject()->setObjectName(this->asQModelingObject()->objectName()); c->asQModelingObject()->setProperty("role", this->asQModelingObject()->property("role")); foreach (QUmlComment *element, ownedComments()) c->addOwnedComment(dynamic_cast(element->clone())); c->setName(name()); if (nameExpression()) c->setNameExpression(dynamic_cast(nameExpression()->clone())); foreach (QUmlElementImport *element, elementImports()) c->addElementImport(dynamic_cast(element->clone())); foreach (QUmlConstraint *element, ownedRules()) c->addOwnedRule(dynamic_cast(element->clone())); foreach (QUmlPackageImport *element, packageImports()) c->addPackageImport(dynamic_cast(element->clone())); c->setVisibility(visibility()); c->setLeaf(isLeaf()); foreach (QUmlTemplateBinding *element, templateBindings()) c->addTemplateBinding(dynamic_cast(element->clone())); foreach (QUmlCollaborationUse *element, collaborationUses()) c->addCollaborationUse(dynamic_cast(element->clone())); foreach (QUmlGeneralization *element, generalizations()) c->addGeneralization(dynamic_cast(element->clone())); c->setFinalSpecialization(isFinalSpecialization()); if (ownedTemplateSignature()) c->setOwnedTemplateSignature(dynamic_cast(ownedTemplateSignature()->clone())); foreach (QUmlUseCase *element, ownedUseCases()) c->addOwnedUseCase(dynamic_cast(element->clone())); foreach (QUmlSubstitution *element, substitutions()) c->addSubstitution(dynamic_cast(element->clone())); foreach (QUmlConnector *element, ownedConnectors()) c->addOwnedConnector(dynamic_cast(element->clone())); foreach (QUmlInterfaceRealization *element, interfaceRealizations()) c->addInterfaceRealization(dynamic_cast(element->clone())); foreach (QUmlBehavior *element, ownedBehaviors()) c->addOwnedBehavior(dynamic_cast(element->clone())); c->setAbstract(isAbstract()); c->setActive(isActive()); foreach (QUmlClassifier *element, nestedClassifiers()) c->addNestedClassifier(dynamic_cast(element->clone())); foreach (QUmlProperty *element, ownedAttributes()) c->addOwnedAttribute(dynamic_cast(element->clone())); foreach (QUmlOperation *element, ownedOperations()) c->addOwnedOperation(dynamic_cast(element->clone())); foreach (QUmlReception *element, ownedReceptions()) c->addOwnedReception(dynamic_cast(element->clone())); c->setReentrant(isReentrant()); foreach (QUmlParameter *element, ownedParameters()) c->addOwnedParameter(dynamic_cast(element->clone())); foreach (QUmlParameterSet *element, ownedParameterSets()) c->addOwnedParameterSet(dynamic_cast(element->clone())); foreach (QUmlConstraint *element, postconditions()) c->addPostcondition(dynamic_cast(element->clone())); foreach (QUmlConstraint *element, preconditions()) c->addPrecondition(dynamic_cast(element->clone())); return c; } // OWNED ATTRIBUTES /*! The classifier that is the context for the execution of the behavior. If the behavior is owned by a BehavioredClassifier, that classifier is the context. Otherwise, the context is the first BehavioredClassifier reached by following the chain of owner relationships. For example, following this algorithm, the context of an entry action in a state machine is the classifier that owns the state machine. The features of the context classifier as well as the elements visible to the context classifier are visible to the behavior. \b {This is a read-only derived property.} \b {Subsetted property(ies):} QUmlRedefinableElement::redefinitionContexts(). */ QUmlBehavioredClassifier *QUmlBehavior::context() const { // This is a read-only derived association end qWarning("QUmlBehavior::context(): to be implemented (this is a derived association end)"); return 0; } /*! Adjusts context to \a context. */ void QUmlBehavior::setContext(QUmlBehavioredClassifier *context) { // This is a read-only derived association end qWarning("QUmlBehavior::setContext(): to be implemented (this is a derived association end)"); Q_UNUSED(context); if (false /* */) { // Adjust subsetted properties // removeRedefinitionContext(/* */); // // Adjust subsetted properties if (context) { addRedefinitionContext(context); } } } /*! Tells whether the behavior can be invoked while it is still executing from a previous invocation. */ bool QUmlBehavior::isReentrant() const { // This is a read-write property return _isReentrant; } /*! Adjusts isReentrant to \a isReentrant. */ void QUmlBehavior::setReentrant(bool isReentrant) { // This is a read-write property if (_isReentrant != isReentrant) { _isReentrant = isReentrant; _qModelingObject->modifiedResettableProperties() << QStringLiteral("isReentrant"); } } /*! References a list of parameters to the behavior which describes the order and type of arguments that can be given when the behavior is invoked and of the values which will be returned when the behavior completes its execution. \sa addOwnedParameter(), removeOwnedParameter() \b {Subsetted property(ies):} QUmlNamespace::ownedMembers(). */ const QList QUmlBehavior::ownedParameters() const { // This is a read-write association end return _ownedParameters; } /*! Adds \a ownedParameter to ownedParameters. \sa ownedParameters(), removeOwnedParameter() */ void QUmlBehavior::addOwnedParameter(QUmlParameter *ownedParameter) { // This is a read-write association end if (!_ownedParameters.contains(ownedParameter)) { _ownedParameters.append(ownedParameter); if (ownedParameter && ownedParameter->asQModelingObject() && this->asQModelingObject()) QObject::connect(ownedParameter->asQModelingObject(), SIGNAL(destroyed(QObject*)), this->asQModelingObject(), SLOT(removeOwnedParameter(QObject *))); ownedParameter->asQModelingObject()->setParent(this->asQModelingObject()); // Adjust subsetted properties addOwnedMember(ownedParameter); } } /*! Removes \a ownedParameter from ownedParameters. \sa ownedParameters(), addOwnedParameter() */ void QUmlBehavior::removeOwnedParameter(QUmlParameter *ownedParameter) { // This is a read-write association end if (_ownedParameters.contains(ownedParameter)) { _ownedParameters.removeAll(ownedParameter); if (ownedParameter->asQModelingObject()) ownedParameter->asQModelingObject()->setParent(0); // Adjust subsetted properties removeOwnedMember(ownedParameter); } } /*! The ParameterSets owned by this Behavior. \sa addOwnedParameterSet(), removeOwnedParameterSet() \b {Subsetted property(ies):} QUmlNamespace::ownedMembers(). */ const QSet QUmlBehavior::ownedParameterSets() const { // This is a read-write association end return _ownedParameterSets; } /*! Adds \a ownedParameterSet to ownedParameterSets. \sa ownedParameterSets(), removeOwnedParameterSet() */ void QUmlBehavior::addOwnedParameterSet(QUmlParameterSet *ownedParameterSet) { // This is a read-write association end if (!_ownedParameterSets.contains(ownedParameterSet)) { _ownedParameterSets.insert(ownedParameterSet); if (ownedParameterSet && ownedParameterSet->asQModelingObject() && this->asQModelingObject()) QObject::connect(ownedParameterSet->asQModelingObject(), SIGNAL(destroyed(QObject*)), this->asQModelingObject(), SLOT(removeOwnedParameterSet(QObject *))); ownedParameterSet->asQModelingObject()->setParent(this->asQModelingObject()); // Adjust subsetted properties addOwnedMember(ownedParameterSet); } } /*! Removes \a ownedParameterSet from ownedParameterSets. \sa ownedParameterSets(), addOwnedParameterSet() */ void QUmlBehavior::removeOwnedParameterSet(QUmlParameterSet *ownedParameterSet) { // This is a read-write association end if (_ownedParameterSets.contains(ownedParameterSet)) { _ownedParameterSets.remove(ownedParameterSet); if (ownedParameterSet->asQModelingObject()) ownedParameterSet->asQModelingObject()->setParent(0); // Adjust subsetted properties removeOwnedMember(ownedParameterSet); } } /*! An optional set of Constraints specifying what is fulfilled after the execution of the behavior is completed, if its precondition was fulfilled before its invocation. \sa addPostcondition(), removePostcondition() \b {Subsetted property(ies):} QUmlNamespace::ownedRules(). */ const QSet QUmlBehavior::postconditions() const { // This is a read-write association end return _postconditions; } /*! Adds \a postcondition to postconditions. \sa postconditions(), removePostcondition() */ void QUmlBehavior::addPostcondition(QUmlConstraint *postcondition) { // This is a read-write association end if (!_postconditions.contains(postcondition)) { _postconditions.insert(postcondition); if (postcondition && postcondition->asQModelingObject() && this->asQModelingObject()) QObject::connect(postcondition->asQModelingObject(), SIGNAL(destroyed(QObject*)), this->asQModelingObject(), SLOT(removePostcondition(QObject *))); postcondition->asQModelingObject()->setParent(this->asQModelingObject()); // Adjust subsetted properties addOwnedRule(postcondition); } } /*! Removes \a postcondition from postconditions. \sa postconditions(), addPostcondition() */ void QUmlBehavior::removePostcondition(QUmlConstraint *postcondition) { // This is a read-write association end if (_postconditions.contains(postcondition)) { _postconditions.remove(postcondition); if (postcondition->asQModelingObject()) postcondition->asQModelingObject()->setParent(0); // Adjust subsetted properties removeOwnedRule(postcondition); } } /*! An optional set of Constraints specifying what must be fulfilled when the behavior is invoked. \sa addPrecondition(), removePrecondition() \b {Subsetted property(ies):} QUmlNamespace::ownedRules(). */ const QSet QUmlBehavior::preconditions() const { // This is a read-write association end return _preconditions; } /*! Adds \a precondition to preconditions. \sa preconditions(), removePrecondition() */ void QUmlBehavior::addPrecondition(QUmlConstraint *precondition) { // This is a read-write association end if (!_preconditions.contains(precondition)) { _preconditions.insert(precondition); if (precondition && precondition->asQModelingObject() && this->asQModelingObject()) QObject::connect(precondition->asQModelingObject(), SIGNAL(destroyed(QObject*)), this->asQModelingObject(), SLOT(removePrecondition(QObject *))); precondition->asQModelingObject()->setParent(this->asQModelingObject()); // Adjust subsetted properties addOwnedRule(precondition); } } /*! Removes \a precondition from preconditions. \sa preconditions(), addPrecondition() */ void QUmlBehavior::removePrecondition(QUmlConstraint *precondition) { // This is a read-write association end if (_preconditions.contains(precondition)) { _preconditions.remove(precondition); if (precondition->asQModelingObject()) precondition->asQModelingObject()->setParent(0); // Adjust subsetted properties removeOwnedRule(precondition); } } /*! References a behavior that this behavior redefines. A subtype of Behavior may redefine any other subtype of Behavior. If the behavior implements a behavioral feature, it replaces the redefined behavior. If the behavior is a classifier behavior, it extends the redefined behavior. \sa addRedefinedBehavior(), removeRedefinedBehavior() \b {Subsetted property(ies):} QUmlClassifier::redefinedClassifiers(). */ const QSet QUmlBehavior::redefinedBehaviors() const { // This is a read-write association end return _redefinedBehaviors; } /*! Adds \a redefinedBehavior to redefinedBehaviors. \sa redefinedBehaviors(), removeRedefinedBehavior() */ void QUmlBehavior::addRedefinedBehavior(QUmlBehavior *redefinedBehavior) { // This is a read-write association end if (!_redefinedBehaviors.contains(redefinedBehavior)) { _redefinedBehaviors.insert(redefinedBehavior); if (redefinedBehavior && redefinedBehavior->asQModelingObject() && this->asQModelingObject()) QObject::connect(redefinedBehavior->asQModelingObject(), SIGNAL(destroyed(QObject*)), this->asQModelingObject(), SLOT(removeRedefinedBehavior(QObject *))); // Adjust subsetted properties addRedefinedClassifier(redefinedBehavior); } } /*! Removes \a redefinedBehavior from redefinedBehaviors. \sa redefinedBehaviors(), addRedefinedBehavior() */ void QUmlBehavior::removeRedefinedBehavior(QUmlBehavior *redefinedBehavior) { // This is a read-write association end if (_redefinedBehaviors.contains(redefinedBehavior)) { _redefinedBehaviors.remove(redefinedBehavior); // Adjust subsetted properties removeRedefinedClassifier(redefinedBehavior); } } /*! Designates a behavioral feature that the behavior implements. The behavioral feature must be owned by the classifier that owns the behavior or be inherited by it. The parameters of the behavioral feature and the implementing behavior must match. A behavior does not need to have a specification, in which case it either is the classifer behavior of a BehavioredClassifier or it can only be invoked by another behavior of the classifier. \b {Opposite property(ies):} QUmlBehavioralFeature::methods(). */ QUmlBehavioralFeature *QUmlBehavior::specification() const { // This is a read-write association end return _specification; } /*! Adjusts specification to \a specification. */ void QUmlBehavior::setSpecification(QUmlBehavioralFeature *specification) { // This is a read-write association end if (_specification != specification) { _specification = specification; if (specification && specification->asQModelingObject() && this->asQModelingObject()) QObject::connect(specification->asQModelingObject(), SIGNAL(destroyed()), this->asQModelingObject(), SLOT(setSpecification())); } } QT_END_NAMESPACE