diff options
author | Sandro S. Andrade <sandroandrade@kde.org> | 2013-11-22 18:40:58 -0300 |
---|---|---|
committer | Sandro S. Andrade <sandroandrade@kde.org> | 2013-11-22 22:45:35 +0100 |
commit | 24aff07c12479b93ffa54f7948902a3e179cbcf1 (patch) | |
tree | 001bd6be058de02e64b7bc17d5b7fc4180efe511 | |
parent | 1de3f3970c6180f509b4f37e8863a6b651e0b399 (diff) |
Add initial implementation of DuSE design dimension instances creation
Change-Id: I0fad717851329d7664048d51b2992a6654e2650f
Reviewed-by: Sandro S. Andrade <sandroandrade@kde.org>
8 files changed, 97 insertions, 10 deletions
diff --git a/examples/uml/duse-mt/src/app/SADuse.xmi b/examples/uml/duse-mt/src/app/SADuse.xmi index 6457c864..8eea2091 100644 --- a/examples/uml/duse-mt/src/app/SADuse.xmi +++ b/examples/uml/duse-mt/src/app/SADuse.xmi @@ -106,7 +106,7 @@ <designDimension xmi:type="duse:DesignDimension" name="Tuning Approach" xmi:id="SADuse-TunningApproach"> <instanceSelectionRule xmi:type="uml:OpaqueExpression" xmi:id="SADuse-TunningApproach-InstanceSelectionRule"> <language>JavaScript</language> - <body>var inputLength = input.length; var selected = new Array(); for (var i = 0; i < inputLength; ++i) { if (input[i] instanceof QSADuseProfileProcessComponent) selected.push(input[i].base_Component); } selected;</body> + <body>var inputLength = input.length; var selected = new Array(); for (var i = 0; i < inputLength; ++i) { selected.push(typeof(input[i])); } selected;</body> </instanceSelectionRule> <variationPoint xmi:type="duse:VariationPoint" name="Cohen-Coon" xmi:id="SADuse-TunningApproach-Cohen-Coon"> <modelChange xmi:type="duse:ModelChange" xmi:id="SADuse-TunningApproach-Cohen-Coon-ModelChange1"> @@ -196,7 +196,7 @@ <designDimension xmi:type="duse:DesignDimension" name="Control Adaptation" xmi:id="SADuse-ControlAdaptation"> <instanceSelectionRule xmi:type="uml:OpaqueExpression" xmi:id="SADuse-ControlAdaptation-InstanceSelectionRule"> <language>JavaScript</language> - <body>var inputLength = input.length; var selected = new Array(); for (var i = 0; i < inputLength; ++i) { if (input[i] instanceof QSADuseProfileProcessComponent) selected.push(input[i].base_Component); } selected;</body> + <body>var inputLength = input.length; var selected = new Array(); for (var i = 0; i < inputLength; ++i) { if (input[i].isKindOf("QSADuseProfileProcessComponent")) selected.push(input[i].base_Component); } selected;</body> </instanceSelectionRule> <variationPoint xmi:type="duse:VariationPoint" name="Gain Scheduling" xmi:id="SADuse-ControlAdaptation-GainScheduling"> <modelChange xmi:type="duse:ModelChange" xmi:id="SADuse-ControlAdaptation-GainScheduling-ModelChange1"> @@ -238,7 +238,7 @@ <designDimension xmi:type="duse:DesignDimension" name="MAPE Deployment" xmi:id="SADuse-MAPEDeployment"> <instanceSelectionRule xmi:type="uml:OpaqueExpression" xmi:id="SADuse-MAPEDeployment-InstanceSelectionRule"> <language>JavaScript</language> - <body>var inputLength = input.length; var selected = new Array(); for (var i = 0; i < inputLength; ++i) { if (input[i] instanceof QSADuseProfileProcessComponent) selected.push(input[i].base_Component); } selected;</body> + <body>var inputLength = input.length; var selected = new Array(); for (var i = 0; i < inputLength; ++i) { if (input[i].isKindOf("QSADuseProfileProcessComponent")) selected.push(input[i].base_Component); } selected;</body> </instanceSelectionRule> <variationPoint xmi:type="duse:VariationPoint" name="Local Control + Shared Reference" xmi:id="SADuse-MAPEDeployment-LocalControl+SharedReference"> <modelChange xmi:type="duse:ModelChange" xmi:id="SADuse-MAPEDeployment-LocalControl+SharedReference-ModelChange1"> diff --git a/examples/uml/duse-mt/src/app/shell/projectcontroller.cpp b/examples/uml/duse-mt/src/app/shell/projectcontroller.cpp index e95e9855..1718d1ee 100644 --- a/examples/uml/duse-mt/src/app/shell/projectcontroller.cpp +++ b/examples/uml/duse-mt/src/app/shell/projectcontroller.cpp @@ -79,6 +79,11 @@ QList<QModelingObject *> ProjectController::currentModelObjects() const return _currentModelObjects; } +QList<QModelingElement *> ProjectController::currentModelElements() const +{ + return _currentModelElements; +} + bool ProjectController::openModel(const QString &fileName) { qDeleteAll(_currentModelElements); diff --git a/examples/uml/duse-mt/src/app/shell/projectcontroller.h b/examples/uml/duse-mt/src/app/shell/projectcontroller.h index bc161cdd..38bc4c3a 100644 --- a/examples/uml/duse-mt/src/app/shell/projectcontroller.h +++ b/examples/uml/duse-mt/src/app/shell/projectcontroller.h @@ -59,6 +59,7 @@ public: virtual QStringList errorStrings() const; virtual QString currentModelFileName() const; virtual QList<QModelingObject *> currentModelObjects() const; + virtual QList<QModelingElement *> currentModelElements() const; public Q_SLOTS: virtual bool openModel(const QString &fileName); diff --git a/examples/uml/duse-mt/src/libs/duseinterfaces/iprojectcontroller.h b/examples/uml/duse-mt/src/libs/duseinterfaces/iprojectcontroller.h index 551038f8..c48e066c 100644 --- a/examples/uml/duse-mt/src/libs/duseinterfaces/iprojectcontroller.h +++ b/examples/uml/duse-mt/src/libs/duseinterfaces/iprojectcontroller.h @@ -48,6 +48,7 @@ class QWidget; class QModelingObject; +class QModelingElement; class QMetaModelPlugin; namespace DuSE @@ -65,6 +66,7 @@ public: virtual QStringList errorStrings() const = 0; virtual QString currentModelFileName() const = 0; virtual QList<QModelingObject *> currentModelObjects() const = 0; + virtual QList<QModelingElement *> currentModelElements() const = 0; public Q_SLOTS: virtual bool openModel(const QString &fileName) = 0; diff --git a/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorer.pro b/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorer.pro index 4e6506c7..ac665d9c 100644 --- a/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorer.pro +++ b/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorer.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -QT += widgets quick modeling script +QT += widgets quick modeling script uml duse saduseprofile-private include(../../duse-mt-plugin.pri) diff --git a/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorerplugin.cpp b/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorerplugin.cpp index 305e164e..a072c233 100644 --- a/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorerplugin.cpp +++ b/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorerplugin.cpp @@ -56,11 +56,63 @@ #include <QtCore/QFileInfo> +#include <QtScript/QScriptValueIterator> + #include <QtModeling/QXmiReader> #include <QtModeling/QModelingElement> +#include <QtUml/QUmlModel> +#include <QtUml/QUmlProfile> +#include <QtUml/QUmlOpaqueExpression> +#include <QtUml/QUmlProfileApplication> + +#include <QtDuse/QDuseDesignSpace> +#include <QtDuse/QDuseDesignDimension> +#include <QtDuse/QDuseDesignDimensionInstance> + +#include <QtSADuseProfile/QSADuseProfileProcessComponent> +#include "private/qsaduseprofileprocesscomponentobject_p.h" + #include "newdusedesigndialog.h" +template <class T> +QScriptValue qSetToScriptValue(QScriptEngine *engine, const QSet<T *> &elements) +{ + QScriptValue array = engine->newArray(); + foreach (T *element, elements) + array.property(QString::fromLatin1("push")).call(array, QScriptValueList() << engine->newQObject(element)); + return array; +} + +template <class T> +void scriptValueToQSet(const QScriptValue &obj, QSet<T *> &elements) +{ + QScriptValueIterator it(obj); + while (it.hasNext()) { + it.next(); + elements.insert(qobject_cast<T *>(it.value().toQObject())); + } +} + +template <class T> +QScriptValue qListToScriptValue(QScriptEngine *engine, const QList<T *> &elements) +{ + QScriptValue array = engine->newArray(); + foreach (T *element, elements) + array.property(QString::fromLatin1("push")).call(array, QScriptValueList() << engine->newQObject(element)); + return array; +} + +template <class T> +void scriptValueToQList(const QScriptValue &obj, QList<T *> &elements) +{ + QScriptValueIterator it(obj); + while (it.hasNext()) { + it.next(); + elements.append(qobject_cast<T *>(it.value().toQObject())); + } +} + DesignSpaceExplorerPlugin::DesignSpaceExplorerPlugin(QObject *parent) : DuSE::IPlugin(parent), _currentDesignSpaceLocationQuickView(new QQuickView), @@ -75,6 +127,8 @@ DesignSpaceExplorerPlugin::~DesignSpaceExplorerPlugin() delete _newDuseDesignDialog; } +Q_SCRIPT_DECLARE_QMETAOBJECT(QSADuseProfileProcessComponentObject, QSADuseProfileProcessComponent *); + bool DesignSpaceExplorerPlugin::initialize(DuSE::ICore *core) { _core = core; @@ -134,6 +188,9 @@ bool DesignSpaceExplorerPlugin::initialize(DuSE::ICore *core) connect(_actionFileOpenDuseDesign, &QAction::triggered, this, &DesignSpaceExplorerPlugin::openDuseDesign); core->uiController()->addAction(_actionFileOpenDuseDesign, "menu_File"); + qScriptRegisterMetaType(&_engine, qSetToScriptValue<QObject>, scriptValueToQSet<QObject>); + qScriptRegisterMetaType(&_engine, qListToScriptValue<QObject>, scriptValueToQList<QObject>); + return true; } @@ -163,9 +220,13 @@ void DesignSpaceExplorerPlugin::newDuseDesign() } bool found = false; - foreach (QObject *profileApplication, _core->projectController()->currentModelObjects().first()->property("profileApplications").value< QSet<QObject *> >()) { - if ((profileApplication->property("appliedProfile").value<QObject *>())->property("name").toString() == _duseInstance.first()->asQModelingObject()->property("requiredProfile")) + QUmlModel *package = dynamic_cast<QUmlModel *>(_core->projectController()->currentModelElements().first()); + QDuseDesignSpace *designSpace = dynamic_cast<QDuseDesignSpace *>(_duseInstance.first()); + foreach (QUmlProfileApplication *profileApplication, package->profileApplications()) { + if (profileApplication->appliedProfile()->name() == designSpace->requiredProfile()) { found = true; + break; + } } if (!found) { @@ -178,12 +239,23 @@ void DesignSpaceExplorerPlugin::newDuseDesign() array.property(QString::fromLatin1("push")).call(array, QScriptValueList() << _engine.newQObject(modelingObject)); _engine.globalObject().setProperty("input", array); - foreach (QObject *designDimension, _duseInstance.first()->asQModelingObject()->property("designDimensions").value< QList<QObject *> >()) { - foreach (const QString &body, (designDimension->property("instanceSelectionRule").value<QObject *>())->property("bodies").value< QList<QString> >()) { + foreach (QDuseDesignDimension *designDimension, designSpace->designDimensions()) { + foreach (const QString &body, designDimension->instanceSelectionRule()->bodies()) { qDebug() << body; QScriptValue value = _engine.evaluate(body); - if (value.toQObject()) - qDebug() << "result: " << value.toQObject()->objectName(); + if (value.toVariant().canConvert(QMetaType::type("QList<QObject*>"))) { + foreach (QObject *targetInstance, value.toVariant().value< QList<QObject*> >()) { + QDuseDesignDimensionInstance *designDimensionInstance = new QDuseDesignDimensionInstance; + designDimensionInstance->setTargetInstance(qmodelingelementproperty_cast<QUmlElement *>(targetInstance)); + designDimension->addDesignDimensionInstance(designDimensionInstance); + } + } + else if (value.toVariant().canConvert(QMetaType::type("QObject*"))) { + QDuseDesignDimensionInstance *designDimensionInstance = new QDuseDesignDimensionInstance; + designDimensionInstance->setTargetInstance(qmodelingelementproperty_cast<QUmlElement *>(value.toVariant().value<QObject *>())); + designDimension->addDesignDimensionInstance(designDimensionInstance); + } + qDebug() << "result: " << value.toVariant(); } } diff --git a/src/modeling/qmodelingobject.cpp b/src/modeling/qmodelingobject.cpp index 48169ee4..9e7ba5c3 100644 --- a/src/modeling/qmodelingobject.cpp +++ b/src/modeling/qmodelingobject.cpp @@ -106,6 +106,12 @@ QStringList &QModelingObject::modifiedResettableProperties() return d->modifiedResettableProperties; } +bool QModelingObject::isKindOf(QString type) const +{ + Q_D(const QModelingObject); + return d->propertyGroups.contains(type); +} + QModelingObject::QModelingObject() : QObject(*new QModelingObjectPrivate) { diff --git a/src/modeling/qmodelingobject.h b/src/modeling/qmodelingobject.h index 66d365c9..ba8f6aa7 100644 --- a/src/modeling/qmodelingobject.h +++ b/src/modeling/qmodelingobject.h @@ -70,6 +70,7 @@ public: const QStringList &propertyGroups() const; const QMultiHash<QString, QMetaProperty *> &groupProperties() const; QStringList &modifiedResettableProperties(); + Q_INVOKABLE bool isKindOf(QString type) const; static QHash< QString, QHash< QString, QHash<QtModeling::MetaPropertyDataRole, QVariant> > > propertyDataHash; |