summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSandro S. Andrade <sandroandrade@kde.org>2013-11-22 18:40:58 -0300
committerSandro S. Andrade <sandroandrade@kde.org>2013-11-22 22:45:35 +0100
commit24aff07c12479b93ffa54f7948902a3e179cbcf1 (patch)
tree001bd6be058de02e64b7bc17d5b7fc4180efe511
parent1de3f3970c6180f509b4f37e8863a6b651e0b399 (diff)
Add initial implementation of DuSE design dimension instances creation
Change-Id: I0fad717851329d7664048d51b2992a6654e2650f Reviewed-by: Sandro S. Andrade <sandroandrade@kde.org>
-rw-r--r--examples/uml/duse-mt/src/app/SADuse.xmi6
-rw-r--r--examples/uml/duse-mt/src/app/shell/projectcontroller.cpp5
-rw-r--r--examples/uml/duse-mt/src/app/shell/projectcontroller.h1
-rw-r--r--examples/uml/duse-mt/src/libs/duseinterfaces/iprojectcontroller.h2
-rw-r--r--examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorer.pro2
-rw-r--r--examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorerplugin.cpp84
-rw-r--r--src/modeling/qmodelingobject.cpp6
-rw-r--r--src/modeling/qmodelingobject.h1
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 &lt; 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 &lt; 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 &lt; 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 &lt; 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 &lt; 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 &lt; 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;