changeset 31:07efb25d24d6

* Merge revs 7200-7222 from SVN (update use of loader API, switch to using mapper for merge operation)
author Chris Cannam
date Thu, 18 Mar 2010 16:59:24 +0000
parents 8bed05455706
children abd5d022c85d
files common/Objects.cpp common/Objects.h testapp/Loader.cpp utilities/composer/composer.cpp utilities/composer/composer.pro utilities/widgettest/widgettest.cpp
diffstat 6 files changed, 210 insertions(+), 118 deletions(-) [+]
line wrap: on
line diff
--- a/common/Objects.cpp	Tue Mar 16 17:36:28 2010 +0000
+++ b/common/Objects.cpp	Thu Mar 18 16:59:24 2010 +0000
@@ -600,16 +600,23 @@
     }
 
     if (!m_birth) {
-        if (c->birth()) m_birth = new Birth(*c->birth());
+        if (c->birth()) {
+            m_birth = new Birth(*c->birth());
+            emit birthChanged(m_birth);
+        }
     }
 
     if (!m_death) {
-        if (c->death()) m_death = new Death(*c->death());
+        if (c->death()) {
+            m_death = new Death(*c->death());
+            emit deathChanged(m_death);
+        }
     }
         
     if (c->gender() != "") {
         if (m_gender == "") {
             m_gender = c->gender();
+            emit genderChanged(m_gender);
         } else if (c->gender() != m_gender) {
             std::cerr << "WARNING: Composer::mergeFrom: Gender mismatch! Composer " << c->name().toStdString() << " has gender " << c->gender().toStdString() << ", but target composer " << m_name.toStdString() << " has gender " << m_gender.toStdString() << std::endl;
         }
@@ -629,6 +636,14 @@
     
     if (m_period == "") m_period = c->period();
     if (m_remarks == "") m_remarks = c->remarks();
+
+    emit nationalityChanged(m_nationality);
+    emit geonameURIsChanged(m_geonameURIs);
+    emit otherURIsChanged(m_otherURIs);
+    emit pagesChanged(m_pages);
+    emit periodChanged(m_period);
+    emit remarksChanged(m_remarks);
+    emit aliasesChanged(m_aliases);
 }
 
 static int
--- a/common/Objects.h	Tue Mar 16 17:36:28 2010 +0000
+++ b/common/Objects.h	Thu Mar 18 16:59:24 2010 +0000
@@ -50,9 +50,9 @@
 {
     Q_OBJECT
 
-    Q_PROPERTY(ClassicalData::Year year READ year WRITE setYear STORED true)
-    Q_PROPERTY(QString place READ place WRITE setPlace STORED true)
-    Q_PROPERTY(bool approximate READ approximate WRITE setApproximate STORED true)
+    Q_PROPERTY(ClassicalData::Year year READ year WRITE setYear NOTIFY yearChanged STORED true)
+    Q_PROPERTY(QString place READ place WRITE setPlace NOTIFY placeChanged STORED true)
+    Q_PROPERTY(bool approximate READ approximate WRITE setApproximate NOTIFY approximateChanged STORED true)
 
 public:
     HistoricalEvent() : m_year(0), m_place(), m_approximate(false) { }
@@ -61,12 +61,17 @@
     HistoricalEvent(const HistoricalEvent &h) : QObject(), m_year(h.m_year), m_place(h.m_place), m_approximate(h.m_approximate) { }
 
     Year year() const { return m_year; }
-    void setYear(Year y) { m_year = y; }
+    void setYear(Year y) { m_year = y; emit yearChanged(y); }
     QString place() const { return m_place; }
-    void setPlace(QString p) { m_place = p; }
+    void setPlace(QString p) { m_place = p; emit placeChanged(p); }
     bool approximate() const { return m_approximate; }
-    void setApproximate(bool a) { m_approximate = a; }
+    void setApproximate(bool a) { m_approximate = a; emit approximateChanged(a); }
     
+signals:
+    void yearChanged(Year);
+    void placeChanged(QString);
+    void approximateChanged(bool);
+
 private:
     Year m_year;
     QString m_place;
@@ -100,8 +105,8 @@
 {
     Q_OBJECT
     
-    Q_PROPERTY(ClassicalData::Composer *composer READ composer WRITE setComposer STORED true)
-    Q_PROPERTY(QSet<ClassicalData::Work *> works READ works WRITE setWorks STORED true)
+    Q_PROPERTY(ClassicalData::Composer *composer READ composer WRITE setComposer NOTIFY composerChanged STORED true)
+    Q_PROPERTY(QSet<ClassicalData::Work *> works READ works WRITE setWorks NOTIFY worksChanged STORED true)
     Q_PROPERTY(QString composerName READ composerName WRITE setComposerName STORED false)
 
 public:
@@ -110,16 +115,20 @@
     Composition(Year y, QString p) : HistoricalEvent(y, p), m_composer(0) { }
 
     Composer *composer() { return m_composer; }
-    void setComposer(Composer *c) { m_composer = c; }
+    void setComposer(Composer *c) { m_composer = c; emit composerChanged(c); }
 
     QSet<Work *> works() { return m_works; }
-    void setWorks(QSet<Work *> c) { m_works = c; }
-    void addWork(Work *w) { m_works.insert(w); }
+    void setWorks(QSet<Work *> c) { m_works = c; emit worksChanged(c); }
+    void addWork(Work *w) { m_works.insert(w); emit worksChanged(m_works); }
 
     // Not a storable property, set temporarily while composer record is found
     QString composerName() const { return m_cname; }
     void setComposerName(QString n) { m_cname = n; }
 
+signals:
+    void composerChanged(Composer *);
+    void worksChanged(QSet<Work *>);
+
 private:
     Composer *m_composer;
     QSet<Work *> m_works;
@@ -130,21 +139,26 @@
 {
     Q_OBJECT
 
-    Q_PROPERTY(Dataquay::Uri uri READ uri WRITE setUri STORED true)
-    Q_PROPERTY(QString siteName READ siteName WRITE setSiteName STORED true)
-    Q_PROPERTY(QObject *topic READ topic WRITE setTopic STORED true)
+    Q_PROPERTY(Dataquay::Uri uri READ uri WRITE setUri NOTIFY uriChanged STORED true)
+    Q_PROPERTY(QString siteName READ siteName WRITE setSiteName NOTIFY siteNameChanged STORED true)
+    Q_PROPERTY(QObject *topic READ topic WRITE setTopic NOTIFY topicChanged STORED true)
 
 public:
     Document(QObject *parent = 0) : QObject(parent), m_topic(0) { }
     
     Dataquay::Uri uri() const { return m_uri; }
-    void setUri(Dataquay::Uri uri) { m_uri = uri; }
+    void setUri(Dataquay::Uri uri) { m_uri = uri; emit uriChanged(uri); }
 
     QString siteName() const { return m_siteName; }
-    void setSiteName(QString n) { m_siteName = n; }
+    void setSiteName(QString n) { m_siteName = n; emit siteNameChanged(n); }
 
     QObject *topic() const { return m_topic; } // I don't own this
-    void setTopic(QObject *t) { m_topic = t; }
+    void setTopic(QObject *t) { m_topic = t; emit topicChanged(t); }
+
+signals:
+    void uriChanged(Dataquay::Uri);
+    void siteNameChanged(QString);
+    void topicChanged(QObject *);
     
 private:
     Dataquay::Uri m_uri;
@@ -157,44 +171,56 @@
 {
     Q_OBJECT
 
-    Q_PROPERTY(QString name READ name WRITE setName STORED true)
-    Q_PROPERTY(QSet<QString> aliases READ aliases WRITE setAliases STORED true)
-    Q_PROPERTY(QString remarks READ remarks WRITE setRemarks STORED true)
-    Q_PROPERTY(QSet<ClassicalData::Document*> pages READ pages WRITE setPages STORED true)
-    Q_PROPERTY(QSet<Dataquay::Uri> otherURIs READ otherURIs WRITE setOtherURIs STORED true)
+    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged STORED true)
+    Q_PROPERTY(QSet<QString> aliases READ aliases WRITE setAliases NOTIFY aliasesChanged STORED true)
+    Q_PROPERTY(QString remarks READ remarks WRITE setRemarks NOTIFY remarksChanged STORED true)
+    Q_PROPERTY(QSet<ClassicalData::Document*> pages READ pages WRITE setPages NOTIFY pagesChanged STORED true)
+    Q_PROPERTY(QSet<Dataquay::Uri> otherURIs READ otherURIs WRITE setOtherURIs NOTIFY otherURIsChanged STORED true)
 
 public:
     NamedEntity(QObject *parent = 0) : QObject(parent) { }
     ~NamedEntity() {
+/*
         for (QSet<Document *>::iterator i = m_pages.begin();
              i != m_pages.end(); ++i) {
             delete *i;
         }
+*/
     }
 
     QString name() const { return m_name; }
-    virtual void setName(QString n) { m_name = n; }
+    virtual void setName(QString n) { m_name = n; emit nameChanged(n); }
 
     QString remarks() const { return m_remarks; }
-    void setRemarks(QString n) { m_remarks = n; }
+    void setRemarks(QString n) { m_remarks = n; emit remarksChanged(n); }
     
     QSet<QString> aliases() const { return m_aliases; }
-    virtual void setAliases(QSet<QString> l) { m_aliases = l; }
-    virtual void addAlias(QString a) { m_aliases.insert(a); }
+    virtual void setAliases(QSet<QString> l) { m_aliases = l; emit aliasesChanged(l); }
+    virtual void addAlias(QString a) { m_aliases.insert(a); emit aliasesChanged(m_aliases); }
 
     QSet<Document *> pages() const { return m_pages; }
-    void addPage(Document *p) { m_pages.insert(p); }
+    void addPage(Document *p) { m_pages.insert(p); emit pagesChanged(m_pages); }
     void setPages(QSet<Document *> p) {
+/*
         for (QSet<Document *>::iterator i = m_pages.begin();
              i != m_pages.end(); ++i) {
             delete *i;
         }
+*/
         m_pages = p;
+        emit pagesChanged(p);
     }
 
     QSet<Dataquay::Uri> otherURIs() const { return m_otherURIs; }
-    void addOtherURI(Dataquay::Uri u) { m_otherURIs.insert(u); }
-    void setOtherURIs(QSet<Dataquay::Uri> u) { m_otherURIs = u; }
+    void addOtherURI(Dataquay::Uri u) { m_otherURIs.insert(u); emit otherURIsChanged(m_otherURIs); }
+    void setOtherURIs(QSet<Dataquay::Uri> u) { m_otherURIs = u; emit otherURIsChanged(u); }
+
+signals:
+    void nameChanged(QString);
+    void remarksChanged(QString);
+    void aliasesChanged(QSet<QString>);
+    void pagesChanged(QSet<Document *>);
+    void otherURIsChanged(QSet<Dataquay::Uri>);
 
 protected:
     QString m_name;
@@ -212,49 +238,49 @@
 {
     Q_OBJECT
 
-    Q_PROPERTY(QString key READ key WRITE setKey STORED true)
-    Q_PROPERTY(QString opus READ opus WRITE setOpus STORED true)
-    Q_PROPERTY(QString catalogue READ catalogue WRITE setCatalogue STORED true)
-    Q_PROPERTY(QString number READ number WRITE setNumber STORED true)
-    Q_PROPERTY(QSet<ClassicalData::Form*> forms READ forms WRITE setForms STORED true)
-    Q_PROPERTY(ClassicalData::Work* partOf READ partOf WRITE setPartOf STORED true)
-    Q_PROPERTY(QSet<ClassicalData::Work*> parts READ parts WRITE setParts STORED true)
-    Q_PROPERTY(QSet<ClassicalData::Movement*> movements READ movements WRITE setMovements STORED true)
-    Q_PROPERTY(ClassicalData::Composition *composition READ composition WRITE setComposition STORED true)
+    Q_PROPERTY(QString key READ key WRITE setKey NOTIFY keyChanged STORED true)
+    Q_PROPERTY(QString opus READ opus WRITE setOpus NOTIFY opusChanged STORED true)
+    Q_PROPERTY(QString catalogue READ catalogue WRITE setCatalogue NOTIFY catalogueChanged STORED true)
+    Q_PROPERTY(QString number READ number WRITE setNumber NOTIFY numberChanged STORED true)
+    Q_PROPERTY(QSet<ClassicalData::Form*> forms READ forms WRITE setForms NOTIFY formsChanged STORED true)
+    Q_PROPERTY(ClassicalData::Work* partOf READ partOf WRITE setPartOf NOTIFY partOfChanged STORED true)
+    Q_PROPERTY(QSet<ClassicalData::Work*> parts READ parts WRITE setParts NOTIFY partsChanged STORED true)
+    Q_PROPERTY(QSet<ClassicalData::Movement*> movements READ movements WRITE setMovements NOTIFY movementsChanged STORED true)
+    Q_PROPERTY(ClassicalData::Composition *composition READ composition WRITE setComposition NOTIFY compositionChanged STORED true)
 
 public:
     Work(QObject *parent = 0) : NamedEntity(parent), m_partOf(0), m_composition(0) { }
 
     QString key() const { return m_key; }
-    void setKey(QString n) { m_key = n; }
+    void setKey(QString n) { m_key = n; emit keyChanged(n); }
 
     QString opus() const { return m_opus; }
-    void setOpus(QString n) { m_opus = n; }
+    void setOpus(QString n) { m_opus = n; emit opusChanged(n); }
 
     QString catalogue() const { return m_catalogue; }
-    void setCatalogue(QString n) { m_catalogue = n; }
+    void setCatalogue(QString n) { m_catalogue = n; emit catalogueChanged(n); }
 
     QString number() const { return m_number; }
-    void setNumber(QString n) { m_number = n; }
+    void setNumber(QString n) { m_number = n; emit numberChanged(n); }
 
     QSet<Form *> forms() const { return m_forms; }
-    void setForms(QSet<Form *> f) { m_forms = f; }
-    void addForm(Form *f) { m_forms.insert(f); }
+    void setForms(QSet<Form *> f) { m_forms = f; emit formsChanged(f); }
+    void addForm(Form *f) { m_forms.insert(f); emit formsChanged(m_forms); }
 
     Work *partOf() const { return m_partOf; }
-    void setPartOf(Work *w) { m_partOf = w; }
+    void setPartOf(Work *w) { m_partOf = w; emit partOfChanged(w); }
 
     QSet<Work *> parts() const { return m_parts; }
-    void setParts(QSet<Work *> l) { m_parts = l; }
-    void addPart(Work *w) { m_parts.insert(w); }
+    void setParts(QSet<Work *> l) { m_parts = l; emit partsChanged(l); }
+    void addPart(Work *w) { m_parts.insert(w); emit partsChanged(m_parts); }
 
     QSet<Movement *> movements() const { return m_movements; }
-    void setMovements(QSet<Movement *> l) { m_movements = l; }
-    void addMovement(Movement *w) { m_movements.insert(w); }
+    void setMovements(QSet<Movement *> l) { m_movements = l; emit movementsChanged(l); }
+    void addMovement(Movement *w) { m_movements.insert(w); emit movementsChanged(m_movements); }
 
     Composition *composition() { return m_composition; }
     const Composition *composition() const { return m_composition; }
-    void setComposition(Composition *c) { m_composition = c; }
+    void setComposition(Composition *c) { m_composition = c; emit compositionChanged(c); }
 
     struct Ordering {
         bool operator()(Work *, Work *);
@@ -269,6 +295,17 @@
     //!!! todo: unit tests
     static int compareCatalogueNumberTexts(QString a, QString b);
 
+signals:
+    void keyChanged(QString);
+    void opusChanged(QString);
+    void catalogueChanged(QString);
+    void numberChanged(QString);
+    void formsChanged(QSet<Form *>);
+    void partOfChanged(Work *);
+    void partsChanged(QSet<Work *>);
+    void movementsChanged(QSet<Movement *>);
+    void compositionChanged(Composition *);    
+
 private:
     QString m_key;
     QString m_opus;
@@ -285,31 +322,38 @@
 {
     Q_OBJECT
 
-    Q_PROPERTY(QString key READ key WRITE setKey STORED true)
-    Q_PROPERTY(QString number READ number WRITE setNumber STORED true)
-    Q_PROPERTY(ClassicalData::Work* partOf READ partOf WRITE setPartOf STORED true)
-    Q_PROPERTY(QSet<ClassicalData::Movement*> parts READ parts WRITE setParts STORED true) // movements can be nested
-    Q_PROPERTY(ClassicalData::Composition *composition READ composition WRITE setComposition STORED true)
+    Q_PROPERTY(QString key READ key WRITE setKey NOTIFY keyChanged STORED true)
+    Q_PROPERTY(QString number READ number WRITE setNumber NOTIFY numberChanged STORED true)
+    Q_PROPERTY(ClassicalData::Work* partOf READ partOf WRITE setPartOf NOTIFY partOfChanged STORED true)
+    Q_PROPERTY(QSet<ClassicalData::Movement*> parts READ parts WRITE setParts NOTIFY partsChanged STORED true) // movements can be nested
+    Q_PROPERTY(ClassicalData::Composition *composition READ composition WRITE setComposition NOTIFY compositionChanged STORED true)
 
 public:
     Movement(QObject *parent = 0) : NamedEntity(parent), m_partOf(0), m_composition(0) { }
 
     QString key() const { return m_key; }
-    void setKey(QString n) { m_key = n; }
+    void setKey(QString n) { m_key = n; emit keyChanged(n); }
 
     QString number() const { return m_number; }
-    void setNumber(QString n) { m_number = n; }
+    void setNumber(QString n) { m_number = n; emit numberChanged(n); }
 
     Work *partOf() const { return m_partOf; }
-    void setPartOf(Work *w) { m_partOf = w; }
+    void setPartOf(Work *w) { m_partOf = w; emit partOfChanged(w); }
 
     QSet<Movement *> parts() const { return m_parts; }
-    void setParts(QSet<Movement *> l) { m_parts = l; }
-    void addPart(Movement *w) { m_parts.insert(w); }
+    void setParts(QSet<Movement *> l) { m_parts = l; emit partsChanged(l); }
+    void addPart(Movement *w) { m_parts.insert(w); emit partsChanged(m_parts); }
 
     Composition *composition() { return m_composition; }
     const Composition *composition() const { return m_composition; }
-    void setComposition(Composition *c) { m_composition = c; }
+    void setComposition(Composition *c) { m_composition = c; emit compositionChanged(c); }
+
+signals:
+    void keyChanged(QString);
+    void numberChanged(QString);
+    void partOfChanged(Work *);
+    void partsChanged(QSet<Movement *>);
+    void compositionChanged(Composition *);
 
 private:
     QString m_key;
@@ -323,12 +367,12 @@
 {
     Q_OBJECT
 
-    Q_PROPERTY(QString gender READ gender WRITE setGender STORED true)
-    Q_PROPERTY(QSet<QString> nationality READ nationality WRITE setNationality STORED true)
-    Q_PROPERTY(QSet<Dataquay::Uri> geonameURIs READ geonameURIs WRITE setGeonameURIs STORED true)
-    Q_PROPERTY(QString period READ period WRITE setPeriod STORED true)
-    Q_PROPERTY(ClassicalData::Birth *birth READ birth WRITE setBirth STORED true)
-    Q_PROPERTY(ClassicalData::Death *death READ death WRITE setDeath STORED true)
+    Q_PROPERTY(QString gender READ gender WRITE setGender NOTIFY genderChanged STORED true)
+    Q_PROPERTY(QSet<QString> nationality READ nationality WRITE setNationality NOTIFY nationalityChanged STORED true)
+    Q_PROPERTY(QSet<Dataquay::Uri> geonameURIs READ geonameURIs WRITE setGeonameURIs NOTIFY geonameURIsChanged STORED true)
+    Q_PROPERTY(QString period READ period WRITE setPeriod NOTIFY periodChanged STORED true)
+    Q_PROPERTY(ClassicalData::Birth *birth READ birth WRITE setBirth NOTIFY birthChanged STORED true)
+    Q_PROPERTY(ClassicalData::Death *death READ death WRITE setDeath NOTIFY deathChanged STORED true)
 
     Q_PROPERTY(QString surname READ getSurname STORED false)
     Q_PROPERTY(QString forenames READ getForenames STORED false)
@@ -338,26 +382,26 @@
         NamedEntity(parent), m_birth(0), m_death(0), m_namesCached(false) { }
 
     QString gender() const { return m_gender; }
-    void setGender(QString n) { m_gender = n; }
+    void setGender(QString n) { m_gender = n; emit genderChanged(n); }
 
     QSet<QString> nationality() const { return m_nationality; }
-    void setNationality(QSet<QString> n) { m_nationality = n; }
-    void addNationality(QString n) { m_nationality.insert(n); }
+    void setNationality(QSet<QString> n) { m_nationality = n; emit nationalityChanged(n); }
+    void addNationality(QString n) { m_nationality.insert(n); emit nationalityChanged(m_nationality); }
 
     QSet<Dataquay::Uri> geonameURIs() const { return m_geonameURIs; }
-    void setGeonameURIs(QSet<Dataquay::Uri> n) { m_geonameURIs = n; }
-    void addGeonameURI(Dataquay::Uri n) { m_geonameURIs.insert(n); }
+    void setGeonameURIs(QSet<Dataquay::Uri> n) { m_geonameURIs = n; emit geonameURIsChanged(n); }
+    void addGeonameURI(Dataquay::Uri n) { m_geonameURIs.insert(n); emit geonameURIsChanged(m_geonameURIs); }
 
     QString period() const { return m_period; }
-    void setPeriod(QString n) { m_period = n; }
+    void setPeriod(QString n) { m_period = n; emit periodChanged(n); }
 
     Birth *birth() { return m_birth; }
     const Birth *birth() const { return m_birth; }
-    void setBirth(Birth *b) { m_birth = b; }
+    void setBirth(Birth *b) { m_birth = b; emit birthChanged(b); }
 
     Death *death() { return m_death; }
     const Death *death() const { return m_death; }
-    void setDeath(Death *d) { m_death = d; }
+    void setDeath(Death *d) { m_death = d; emit deathChanged(d); }
 
     virtual void setName(QString n) {
         NamedEntity::setName(n);
@@ -453,6 +497,14 @@
      */
     static QString reduceName(QString name);
 
+signals:
+    void genderChanged(QString);
+    void nationalityChanged(QSet<QString>);
+    void geonameURIsChanged(QSet<Dataquay::Uri>);
+    void periodChanged(QString);
+    void birthChanged(Birth *);
+    void deathChanged(Death *);
+
 private:
     QString m_gender;
     QSet<QString> m_nationality;
@@ -478,7 +530,7 @@
 {
     Q_OBJECT
 
-    Q_PROPERTY(QString uri READ uri)
+    Q_PROPERTY(Dataquay::Uri uri READ uri)
 
 public:
     Form(QObject *parent = 0) : NamedEntity(parent) { }
@@ -493,8 +545,9 @@
         return m_map[name];
     }
 
-    QString uri() const {
-        return QString(":form_%1").arg(name()).toLower().replace(' ', '_');
+    Dataquay::Uri uri() const {
+        return Dataquay::Uri
+            (QString(":form_%1").arg(name()).toLower().replace(' ', '_'));
     }
 
 private:
--- a/testapp/Loader.cpp	Tue Mar 16 17:36:28 2010 +0000
+++ b/testapp/Loader.cpp	Thu Mar 18 16:59:24 2010 +0000
@@ -61,14 +61,22 @@
 
     std::cerr << "imported, mapping..." << std::endl;
 
-    QObject *root = loader->loadAllObjects(0);
+//    QObject *root = loader->loadAllObjects(0);
+
+    QObjectList objects;
+    try {
+        objects = loader->loadAll();
+    } catch (const std::exception &e) {
+        std::cerr << "mapping failed: " << e.what() << std::endl;
+        return 1;
+    }
 
     delete loader;
     delete store;
 
     QObjectList composers;
 //    std::cerr << "Known composers:" << std::endl;
-    foreach (QObject *o, root->children()) {
+    foreach (QObject *o, objects) {
         Composer *c = qobject_cast<Composer *>(o);
         if (c) {
             QString sn = c->getSortName(true);
--- a/utilities/composer/composer.cpp	Tue Mar 16 17:36:28 2010 +0000
+++ b/utilities/composer/composer.cpp	Thu Mar 18 16:59:24 2010 +0000
@@ -4,9 +4,11 @@
 #include "TypeRegistrar.h"
 
 #include <dataquay/BasicStore.h>
+#include <dataquay/TransactionalStore.h>
 #include <dataquay/RDFException.h>
 #include <dataquay/objectmapper/ObjectLoader.h>
 #include <dataquay/objectmapper/ObjectStorer.h>
+#include <dataquay/objectmapper/ObjectMapper.h>
 #include <dataquay/objectmapper/TypeMapping.h>
 #include <dataquay/Debug.h>
 
@@ -284,28 +286,6 @@
         worksMap[target].unite(works);
         worksMap.remove(c);
 
-        // rub out the old composer -- we don't have a neat way to do this yet
-        if (store) {
-            if (c->birth()) {
-                Triple bt(c->birth()->property("uri").value<Uri>(), Node(), Node());
-                if (bt.a.value != "") {
-                    cout << "removing for " << bt.a.value.toStdString() << endl;
-                    store->remove(bt);
-                }
-            }
-            if (c->death()) {
-                Triple dt(c->death()->property("uri").value<Uri>(), Node(), Node());
-                if (dt.a.value != "") {
-                    cout << "removing for " << dt.a.value.toStdString() << endl;
-                    store->remove(dt);
-                }
-            }
-            Triple t(c->property("uri").value<Uri>(), Node(), Node());
-            if (t.a.value != "") {
-                cout << "removing for " << t.a.value.toStdString() << endl;
-                store->remove(t);
-            }
-        }
         delete c->birth();
         delete c->death();
         delete c;
@@ -331,6 +311,7 @@
     BasicStore *store = new BasicStore();
     store->setBaseUri(Uri("http://dbtune.org/classical/resource/"));
     ObjectLoader *loader = new ObjectLoader(store);
+//    loader->setFollowPolicy(ObjectLoader::FollowObjectProperties);
 
     TypeMapping tm;
 
@@ -345,14 +326,39 @@
     }
 
     cerr << "Imported RDF data, mapping to objects...";
-    QObject *root = loader->loadAllObjects(0);
+    QObjectList objects = loader->loadAll();
     cerr << " done" << endl;
 
     delete loader;
 
-    allComposers = root->findChildren<Composer *>();
+    bool write = false;
+    if (command == "merge") {
+        write = true;
+    }
 
-    QList<Work *> works = root->findChildren<Work *>();
+    TransactionalStore *ts = 0;
+    ObjectMapper *mapper = 0;
+
+    if (write) {
+        cerr << "Managing objects...";
+        ts = new TransactionalStore(store);
+        mapper = new ObjectMapper(ts);
+        mapper->setTypeMapping(tm);
+        mapper->manage(objects);
+        cerr << " done" << endl;
+    }
+    
+    foreach (QObject *o, objects) {
+        Composer *c = qobject_cast<Composer *>(o);
+        if (c) allComposers.push_back(c);
+    }
+    
+    QList<Work *> works;
+    foreach (QObject *o, objects) {
+        Work *w = qobject_cast<Work *>(o);
+        if (w) works.push_back(w);
+    }
+
     foreach (Work *w, works) {
         Composition *c = w->composition();
         if (c) {
@@ -361,8 +367,6 @@
         }
     }
 
-    bool write = false;
-
     if (command == "list") {
         if (!args.empty()) usage(argv[0]);
         listBrief(allComposers);
@@ -394,11 +398,11 @@
                 sources.push_back(c);
             }
             merge(target, sources, store);
-            write = true;
         }
     }
         
     if (write) {
+/*
         ObjectStorer *storer = new ObjectStorer(store);
 
         storer->setTypeMapping(tm);
@@ -411,16 +415,24 @@
 //        storer->storeAllObjects(root->children());
 //        storer->setFollowPolicy(ObjectStorer::FollowAll);
         storer->setFollowPolicy(ObjectStorer::FollowObjectProperties);
-        storer->store(root->children());
+        storer->store(objects);
+        cerr << " done" << endl;
+
+        delete storer;
+*/
+
+        cerr << "Committing changes...";
+        mapper->commit();
         cerr << " done" << endl;
 
         cerr << "Saving to file out.ttl...";
         store->save("out.ttl");
         cerr << " done" << endl;
-        
-        delete storer;
     }
 
+    delete mapper;
+    delete ts;
+
     delete store;
 }
 
--- a/utilities/composer/composer.pro	Tue Mar 16 17:36:28 2010 +0000
+++ b/utilities/composer/composer.pro	Thu Mar 18 16:59:24 2010 +0000
@@ -1,6 +1,6 @@
 TEMPLATE = app
 TARGET = composer
-QT -= gui network xml
+#QT -= gui network xml
 
 load(../../../all.prf)
 
--- a/utilities/widgettest/widgettest.cpp	Tue Mar 16 17:36:28 2010 +0000
+++ b/utilities/widgettest/widgettest.cpp	Thu Mar 18 16:59:24 2010 +0000
@@ -84,17 +84,21 @@
     loader->setTypeMapping(tm);
 
     if (!load(store, inFileName)) {
-	cerr << "Failed to load data source" << endl;
-	return 1;
+        cerr << "Failed to load data source" << endl;
+        return 1;
     }
 
     cerr << "Imported RDF data, mapping to objects...";
-    QObject *root = loader->loadAllObjects(0);
+    QObjectList objects = loader->loadAll();
     cerr << " done" << endl;
 
     delete loader;
 
-    QList<Composer *> composers = root->findChildren<Composer *>();
+    QList<Composer *> composers;
+    foreach (QObject *o, objects) {
+        Composer *c = qobject_cast<Composer *>(o);
+        if (c) composers.push_back(c);
+    }
     ComposerTypingThoroughMatcher matcher(composers);
 
     TypingSelectWidget *w = new TypingSelectWidget();