annotate common/Objects.h @ 1:29ca5974905d classical-rdf

* More work on a nice tidy import; get some sensible URIs etc
author Chris Cannam
date Thu, 03 Dec 2009 15:42:10 +0000
parents e8f4c2b55fd8
children 719a4f477098
rev   line source
Chris@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 #ifndef _CLASSICAL_DATA_OBJECTS_H_
Chris@0 4 #define _CLASSICAL_DATA_OBJECTS_H_
Chris@0 5
Chris@0 6 #include <QObject>
Chris@0 7 #include <QMetaType>
Chris@0 8 #include <QString>
Chris@0 9 #include <QStringList>
Chris@0 10 #include <QSharedPointer>
Chris@0 11 #include <QUrl>
Chris@0 12 #include <QSet>
Chris@0 13 #include <QMutex>
Chris@0 14 #include <QMutexLocker>
Chris@0 15 #include <QMap>
Chris@0 16
Chris@0 17 namespace ClassicalData {
Chris@0 18
Chris@0 19 class HistoricalEvent : public QObject
Chris@0 20 {
Chris@0 21 Q_OBJECT
Chris@0 22
Chris@0 23 Q_PROPERTY(int year READ year WRITE setYear STORED true)
Chris@0 24 Q_PROPERTY(QString place READ place WRITE setPlace STORED true)
Chris@0 25 Q_PROPERTY(bool approximate READ approximate WRITE setApproximate STORED true)
Chris@0 26
Chris@0 27 public:
Chris@0 28 HistoricalEvent() : m_year(0), m_place(), m_approximate(false) { }
Chris@0 29 HistoricalEvent(int y) : m_year(y), m_approximate(false) { }
Chris@0 30 HistoricalEvent(int y, QString p) : m_year(y), m_place(p), m_approximate(false) { }
Chris@0 31
Chris@0 32 int year() const { return m_year; }
Chris@0 33 void setYear(int y) { m_year = y; }
Chris@0 34 QString place() const { return m_place; }
Chris@0 35 void setPlace(QString p) { m_place = p; }
Chris@0 36 bool approximate() const { return m_approximate; }
Chris@0 37 void setApproximate(bool a) { m_approximate = a; }
Chris@0 38
Chris@0 39 private:
Chris@0 40 int m_year;
Chris@0 41 QString m_place;
Chris@0 42 bool m_approximate;
Chris@0 43 };
Chris@0 44
Chris@0 45 class Birth : public HistoricalEvent
Chris@0 46 {
Chris@0 47 Q_OBJECT
Chris@0 48
Chris@0 49 public:
Chris@0 50 Birth() : HistoricalEvent() { }
Chris@0 51 Birth(int y) : HistoricalEvent(y) { }
Chris@0 52 Birth(int y, QString p) : HistoricalEvent(y, p) { }
Chris@0 53 };
Chris@0 54
Chris@0 55 class Death : public HistoricalEvent
Chris@0 56 {
Chris@0 57 Q_OBJECT
Chris@0 58
Chris@0 59 public:
Chris@0 60 Death() : HistoricalEvent() { }
Chris@0 61 Death(int y) : HistoricalEvent(y) { }
Chris@0 62 Death(int y, QString p) : HistoricalEvent(y, p) { }
Chris@0 63 };
Chris@0 64
Chris@0 65 class Composer;
Chris@0 66 class Work;
Chris@0 67
Chris@0 68 class Composition : public HistoricalEvent
Chris@0 69 {
Chris@0 70 Q_OBJECT
Chris@0 71
Chris@0 72 Q_PROPERTY(ClassicalData::Composer *composer READ composer WRITE setComposer STORED true)
Chris@0 73 Q_PROPERTY(QSet<ClassicalData::Work *> works READ works WRITE setWorks STORED true)
Chris@0 74 Q_PROPERTY(QString composerName READ composerName WRITE setComposerName STORED false)
Chris@0 75
Chris@0 76 public:
Chris@0 77 Composition() : HistoricalEvent(), m_composer(0) { }
Chris@0 78 Composition(int y) : HistoricalEvent(y), m_composer(0) { }
Chris@0 79 Composition(int y, QString p) : HistoricalEvent(y, p), m_composer(0) { }
Chris@0 80
Chris@0 81 Composer *composer() { return m_composer; }
Chris@0 82 void setComposer(Composer *c) { m_composer = c; }
Chris@0 83
Chris@0 84 QSet<Work *> works() { return m_works; }
Chris@0 85 void setWorks(QSet<Work *> c) { m_works = c; }
Chris@0 86 void addWork(Work *w) { m_works.insert(w); }
Chris@0 87
Chris@0 88 // Not a storable property, set temporarily while composer record is found
Chris@0 89 QString composerName() const { return m_cname; }
Chris@0 90 void setComposerName(QString n) { m_cname = n; }
Chris@0 91
Chris@0 92 private:
Chris@0 93 Composer *m_composer;
Chris@0 94 QSet<Work *> m_works;
Chris@0 95 QString m_cname;
Chris@0 96 };
Chris@0 97
Chris@0 98 class Document : public QObject
Chris@0 99 {
Chris@0 100 Q_OBJECT
Chris@0 101
Chris@0 102 Q_PROPERTY(QUrl uri READ uri WRITE setUri STORED true)
Chris@0 103 Q_PROPERTY(QString siteName READ siteName WRITE setSiteName STORED true)
Chris@0 104 Q_PROPERTY(QObject *topic READ topic WRITE setTopic STORED true)
Chris@0 105
Chris@0 106 public:
Chris@0 107 Document(QObject *parent = 0) : QObject(parent), m_topic(0) { }
Chris@0 108
Chris@0 109 QUrl uri() const { return m_uri; }
Chris@0 110 void setUri(QUrl uri) { m_uri = uri; }
Chris@0 111
Chris@0 112 QString siteName() const { return m_siteName; }
Chris@0 113 void setSiteName(QString n) { m_siteName = n; }
Chris@0 114
Chris@0 115 QObject *topic() const { return m_topic; }
Chris@0 116 void setTopic(QObject *t) { m_topic = t; }
Chris@0 117
Chris@0 118 private:
Chris@0 119 QUrl m_uri;
Chris@0 120 QString m_siteName;
Chris@0 121 QObject *m_topic;
Chris@0 122 };
Chris@0 123
Chris@0 124
Chris@0 125 class NamedEntity : public QObject
Chris@0 126 {
Chris@0 127 Q_OBJECT
Chris@0 128
Chris@0 129 Q_PROPERTY(QString name READ name WRITE setName STORED true)
Chris@0 130 Q_PROPERTY(QSet<QString> aliases READ aliases WRITE setAliases STORED true)
Chris@0 131 Q_PROPERTY(QString remarks READ remarks WRITE setRemarks STORED true)
Chris@0 132 Q_PROPERTY(QSet<ClassicalData::Document*> pages READ pages WRITE setPages STORED true)
Chris@0 133
Chris@0 134 public:
Chris@0 135 NamedEntity(QObject *parent = 0) : QObject(parent) { }
Chris@0 136
Chris@0 137 QString name() const { return m_name; }
Chris@0 138 void setName(QString n) { m_name = n; }
Chris@0 139
Chris@0 140 QString remarks() const { return m_remarks; }
Chris@0 141 void setRemarks(QString n) { m_remarks = n; }
Chris@0 142
Chris@0 143 QSet<QString> aliases() const { return m_aliases; }
Chris@0 144 void setAliases(QSet<QString> l) { m_aliases = l; }
Chris@0 145 void addAlias(QString a) { m_aliases.insert(a); }
Chris@0 146
Chris@0 147 QSet<Document *> pages() const { return m_pages; }
Chris@0 148 void addPage(Document *p) { m_pages.insert(p); }
Chris@0 149 void setPages(QSet<Document *> p) { m_pages = p; } //!!! destroy old ones? do we own?
Chris@0 150
Chris@0 151 private:
Chris@0 152 QString m_name;
Chris@0 153 QString m_remarks;
Chris@0 154 QSet<QString> m_aliases;
Chris@0 155 QSet<Document *> m_pages;
Chris@0 156 };
Chris@0 157
Chris@0 158 class Movement;
Chris@0 159
Chris@0 160 class Form;
Chris@0 161
Chris@0 162 class Work : public NamedEntity
Chris@0 163 {
Chris@0 164 Q_OBJECT
Chris@0 165
Chris@0 166 Q_PROPERTY(QString key READ key WRITE setKey STORED true)
Chris@0 167 Q_PROPERTY(QString opus READ opus WRITE setOpus STORED true)
Chris@0 168 Q_PROPERTY(QString catalogue READ catalogue WRITE setCatalogue STORED true)
Chris@0 169 Q_PROPERTY(QString number READ number WRITE setNumber STORED true)
Chris@0 170 Q_PROPERTY(QSet<ClassicalData::Form*> forms READ forms WRITE setForms STORED true)
Chris@0 171 Q_PROPERTY(ClassicalData::Work* partOf READ partOf WRITE setPartOf STORED true)
Chris@0 172 Q_PROPERTY(QSet<ClassicalData::Work*> parts READ parts WRITE setParts STORED true)
Chris@0 173 Q_PROPERTY(QSet<ClassicalData::Movement*> movements READ movements WRITE setMovements STORED true)
Chris@0 174 Q_PROPERTY(ClassicalData::Composition *composition READ composition WRITE setComposition STORED true)
Chris@0 175
Chris@0 176 public:
Chris@0 177 Work(QObject *parent = 0) : NamedEntity(parent), m_partOf(0), m_composition(0) { }
Chris@0 178
Chris@0 179 QString key() const { return m_key; }
Chris@0 180 void setKey(QString n) { m_key = n; }
Chris@0 181
Chris@0 182 QString opus() const { return m_opus; }
Chris@0 183 void setOpus(QString n) { m_opus = n; }
Chris@0 184
Chris@0 185 QString catalogue() const { return m_catalogue; }
Chris@0 186 void setCatalogue(QString n) { m_catalogue = n; }
Chris@0 187
Chris@0 188 QString number() const { return m_number; }
Chris@0 189 void setNumber(QString n) { m_number = n; }
Chris@0 190
Chris@0 191 QSet<Form *> forms() const { return m_forms; }
Chris@0 192 void setForms(QSet<Form *> f) { m_forms = f; }
Chris@0 193 void addForm(Form *f) { m_forms.insert(f); }
Chris@0 194
Chris@0 195 Work *partOf() const { return m_partOf; }
Chris@0 196 void setPartOf(Work *w) { m_partOf = w; }
Chris@0 197
Chris@0 198 QSet<Work *> parts() const { return m_parts; }
Chris@0 199 void setParts(QSet<Work *> l) { m_parts = l; }
Chris@0 200 void addPart(Work *w) { m_parts.insert(w); }
Chris@0 201
Chris@0 202 QSet<Movement *> movements() const { return m_movements; }
Chris@0 203 void setMovements(QSet<Movement *> l) { m_movements = l; }
Chris@0 204 void addMovement(Movement *w) { m_movements.insert(w); }
Chris@0 205
Chris@0 206 Composition *composition() { return m_composition; }
Chris@0 207 const Composition *composition() const { return m_composition; }
Chris@0 208 void setComposition(Composition *c) { m_composition = c; }
Chris@0 209
Chris@0 210 struct Ordering {
Chris@0 211 bool operator()(Work *, Work *);
Chris@0 212 };
Chris@0 213
Chris@0 214 private:
Chris@0 215 QString m_key;
Chris@0 216 QString m_opus;
Chris@0 217 QString m_catalogue;
Chris@0 218 QString m_number;
Chris@0 219 QSet<Form *> m_forms;
Chris@0 220 Work *m_partOf;
Chris@0 221 QSet<Work *> m_parts;
Chris@0 222 QSet<Movement *> m_movements;
Chris@0 223 Composition *m_composition;
Chris@0 224 };
Chris@0 225
Chris@0 226 class Movement : public NamedEntity
Chris@0 227 {
Chris@0 228 Q_OBJECT
Chris@0 229
Chris@0 230 Q_PROPERTY(QString key READ key WRITE setKey STORED true)
Chris@0 231 Q_PROPERTY(QString number READ number WRITE setNumber STORED true)
Chris@0 232 Q_PROPERTY(ClassicalData::Work* partOf READ partOf WRITE setPartOf STORED true)
Chris@0 233 Q_PROPERTY(QSet<ClassicalData::Movement*> parts READ parts WRITE setParts STORED true) // movements can be nested
Chris@0 234 Q_PROPERTY(ClassicalData::Composition *composition READ composition WRITE setComposition STORED true)
Chris@0 235
Chris@0 236 public:
Chris@0 237 Movement(QObject *parent = 0) : NamedEntity(parent), m_partOf(0), m_composition(0) { }
Chris@0 238
Chris@0 239 QString key() const { return m_key; }
Chris@0 240 void setKey(QString n) { m_key = n; }
Chris@0 241
Chris@0 242 QString number() const { return m_number; }
Chris@0 243 void setNumber(QString n) { m_number = n; }
Chris@0 244
Chris@0 245 Work *partOf() const { return m_partOf; }
Chris@0 246 void setPartOf(Work *w) { m_partOf = w; }
Chris@0 247
Chris@0 248 QSet<Movement *> parts() const { return m_parts; }
Chris@0 249 void setParts(QSet<Movement *> l) { m_parts = l; }
Chris@0 250 void addPart(Movement *w) { m_parts.insert(w); }
Chris@0 251
Chris@0 252 Composition *composition() { return m_composition; }
Chris@0 253 const Composition *composition() const { return m_composition; }
Chris@0 254 void setComposition(Composition *c) { m_composition = c; }
Chris@0 255
Chris@0 256 private:
Chris@0 257 QString m_key;
Chris@0 258 QString m_number;
Chris@0 259 Work *m_partOf;
Chris@0 260 QSet<Movement *> m_parts;
Chris@0 261 Composition *m_composition;
Chris@0 262 };
Chris@0 263
Chris@0 264 class Composer : public NamedEntity
Chris@0 265 {
Chris@0 266 Q_OBJECT
Chris@0 267
Chris@0 268 Q_PROPERTY(QString gender READ gender WRITE setGender STORED true)
Chris@0 269 Q_PROPERTY(QString nationality READ nationality WRITE setNationality STORED true)
Chris@0 270 Q_PROPERTY(QString period READ period WRITE setPeriod STORED true)
Chris@0 271 Q_PROPERTY(ClassicalData::Birth *birth READ birth WRITE setBirth STORED true)
Chris@0 272 Q_PROPERTY(ClassicalData::Death *death READ death WRITE setDeath STORED true)
Chris@0 273
Chris@0 274 public:
Chris@0 275 Composer(QObject *parent = 0) : NamedEntity(parent), m_birth(0), m_death(0) { }
Chris@0 276
Chris@0 277 QString gender() const { return m_gender; }
Chris@0 278 void setGender(QString n) { m_gender = n; }
Chris@0 279
Chris@0 280 QString nationality() const { return m_nationality; }
Chris@0 281 void setNationality(QString n) { m_nationality = n; }
Chris@0 282
Chris@0 283 QString period() const { return m_period; }
Chris@0 284 void setPeriod(QString n) { m_period = n; }
Chris@0 285
Chris@0 286 Birth *birth() { return m_birth; }
Chris@0 287 const Birth *birth() const { return m_birth; }
Chris@0 288 void setBirth(Birth *b) { m_birth = b; }
Chris@0 289
Chris@0 290 Death *death() { return m_death; }
Chris@0 291 const Death *death() const { return m_death; }
Chris@0 292 void setDeath(Death *d) { m_death = d; }
Chris@0 293
Chris@1 294 bool datesMatch(const Composer *other) const; // "well enough"
Chris@0 295 QString getSortName(bool caps) const;
Chris@0 296 QString getDisplayDates() const;
Chris@0 297
Chris@0 298 private:
Chris@0 299 QString m_gender;
Chris@0 300 QString m_nationality;
Chris@0 301 QString m_period;
Chris@0 302 Birth *m_birth;
Chris@0 303 Death *m_death;
Chris@0 304 };
Chris@0 305
Chris@0 306 class Form : public NamedEntity
Chris@0 307 {
Chris@0 308 Q_OBJECT
Chris@0 309
Chris@0 310 Q_PROPERTY(QString uri READ uri)
Chris@0 311
Chris@0 312 public:
Chris@0 313 Form(QObject *parent = 0) : NamedEntity(parent) { }
Chris@0 314
Chris@0 315 static Form *getFormByName(QString name) {
Chris@0 316 QMutexLocker locker(&m_mutex);
Chris@0 317 if (!m_map.contains(name)) {
Chris@0 318 Form *f = new Form();
Chris@0 319 f->setName(name);
Chris@0 320 m_map[name] = f;
Chris@0 321 }
Chris@0 322 return m_map[name];
Chris@0 323 }
Chris@0 324
Chris@0 325 QString uri() const {
Chris@0 326 return QString(":form_%1").arg(name()).toLower().replace(' ', '_');
Chris@0 327 }
Chris@0 328
Chris@0 329 private:
Chris@0 330 static QMap<QString, Form *> m_map;
Chris@0 331 static QMutex m_mutex;
Chris@0 332 };
Chris@0 333
Chris@0 334 }
Chris@0 335
Chris@0 336 Q_DECLARE_METATYPE(ClassicalData::HistoricalEvent*);
Chris@0 337 Q_DECLARE_METATYPE(ClassicalData::Birth*);
Chris@0 338 Q_DECLARE_METATYPE(ClassicalData::Death*);
Chris@0 339 Q_DECLARE_METATYPE(ClassicalData::Composition*);
Chris@0 340 Q_DECLARE_METATYPE(ClassicalData::Work*);
Chris@0 341 Q_DECLARE_METATYPE(ClassicalData::Movement*);
Chris@0 342 Q_DECLARE_METATYPE(ClassicalData::Document*);
Chris@0 343 Q_DECLARE_METATYPE(QSet<QString>);
Chris@0 344 Q_DECLARE_METATYPE(QSet<ClassicalData::Work*>);
Chris@0 345 Q_DECLARE_METATYPE(QSet<ClassicalData::Movement*>);
Chris@0 346 Q_DECLARE_METATYPE(QSet<ClassicalData::Document*>);
Chris@0 347 Q_DECLARE_METATYPE(ClassicalData::Composer*);
Chris@0 348 Q_DECLARE_METATYPE(ClassicalData::Form*);
Chris@0 349 Q_DECLARE_METATYPE(QSet<ClassicalData::Form*>);
Chris@0 350
Chris@0 351 #endif