[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    playground/base/nepomuk-kde/backupsync/service
From:       Vishesh Handa <handa.vish () gmail ! com>
Date:       2010-06-05 18:10:11
Message-ID: 20100605181011.BE3C6AC8CE () svn ! kde ! org
[Download RAW message or body]

SVN commit 1134921 by vhanda:

* Fixed thread related crashes
* Moved external model from Identifier and Merger to IdentificationProcess and \
                MergeRequest
* Changed Identifier's processed signal
* Fixed IdentificationProcess::convert bug


 M  +8 -3      backupsyncservice.cpp  
 M  +30 -14    identificationprocess.cpp  
 M  +7 -1      identificationprocess.h  
 M  +11 -14    identifier.cpp  
 M  +2 -4      identifier.h  
 M  +16 -67    logfile.cpp  
 M  +4 -0      logfile.h  
 M  +6 -16     merger.cpp  
 M  +2 -6      merger.h  
 M  +35 -3     mergerequest.cpp  
 M  +18 -1     mergerequest.h  
 M  +3 -2      syncmanager.cpp  


--- trunk/playground/base/nepomuk-kde/backupsync/service/backupsyncservice.cpp \
#1134920:1134921 @@ -24,6 +24,7 @@
 #include "syncmanager.h"
 #include "syncfile.h"
 #include "backupmanager.h"
+#include "mergerequest.h"
 
 #include "identificationfile.h"
 #include "logfile.h"
@@ -40,13 +41,17 @@
     m_merger = new Merger( this );
 
     m_syncManager = new SyncManager( m_identifier, m_merger, this );
-    //m_backupManager = new BackupManager( m_identifier, m_merger, this );
-    //test();
+    m_backupManager = new BackupManager( m_identifier, m_merger, this );
+
+    //vHanda: Why doesn't this work?
+    qRegisterMetaType<Nepomuk::LogFile>("Nepomuk::LogFile");
+    qRegisterMetaType<Nepomuk::MergeRequest>("Nepomuk::MergeRequest");
 }
 
 Nepomuk::BackupSyncService::~BackupSyncService()
 {
-
+    m_identifier->stop();
+    m_merger->stop();
 }
 
 void Nepomuk::BackupSyncService::test()
--- trunk/playground/base/nepomuk-kde/backupsync/service/identificationprocess.cpp \
#1134920:1134921 @@ -29,10 +29,12 @@
 Nepomuk::IdentificationProcess::IdentificationProcess()
 {
     m_id = -1;
+    m_model = Nepomuk::ResourceManager::instance()->mainModel();
 }
 
-Nepomuk::IdentificationProcess::IdentificationProcess(const Nepomuk::SyncFile & sf)
-    : m_syncFile(sf)
+Nepomuk::IdentificationProcess::IdentificationProcess(const Nepomuk::SyncFile & sf, \
Soprano::Model* model) +    : m_syncFile( sf ),
+      m_model( model )
 {
     m_id = NextId;
     NextId++;
@@ -83,41 +85,48 @@
     }
 }
 
-
+//TODO: Refernce counting doesn't seem to be working
 Nepomuk::LogFile Nepomuk::IdentificationProcess::convert()
 {
     LogFile & masterLogFile = m_syncFile.logFile();
-    LogFile lf( masterLogFile );
-    QList<Record>& records = lf.allRecords();
 
-    QMutableListIterator<Record> it( records );
+    QList<Record> records;
+    QMutableListIterator<Record> it( masterLogFile.allRecords() );
     
     while( it.hasNext() ) {
-        Record& r = it.next();
-        Soprano::Statement st = r.st;
+        Record r = it.next();
         
         // Identify Subject
-        QUrl newUri = hash[ st.subject().uri() ];
+        QUrl subUri = r.st.subject().uri();
+        if( subUri.scheme() == QLatin1String("nepomuk") ) {
+            QUrl newUri = hash[ subUri ];
         if( newUri.isEmpty() ) {
-            it.remove();
             continue;
         }       
         r.st.setSubject( Soprano::Node(newUri) );
+        }
         
+
         // Identify object
-        if( st.object().isResource() ) {
-            QUrl newUri = hash[ st.object().uri() ];
+        if( r.st.object().isResource() ) {
+            QUrl objUri = r.st.object().uri();
+            if( objUri.scheme() == QLatin1String("nepomuk") ) {
+                QUrl newUri = hash[ objUri ];
             if( newUri.isEmpty() ) {
-                it.remove();
                 continue;
             }
             r.st.setObject( newUri );
         }
+        }
         
+        records.push_back( r );
+
         // Remove the statement from the master logfile
-        masterLogFile.remove( r );
+        it.remove();
     }
     
+    LogFile lf;
+    lf.allRecords() = records;
     return lf;
 }
 
@@ -133,3 +142,10 @@
     return m_syncFile.logFile().empty();
 }
 
+
+Soprano::Model* Nepomuk::IdentificationProcess::model() const
+{
+    return m_model;
+}
+
+
--- trunk/playground/base/nepomuk-kde/backupsync/service/identificationprocess.h \
#1134920:1134921 @@ -23,11 +23,13 @@
 #include <QtCore/QUrl>
 #include <QtCore/QMultiHash>
 
+#include <Nepomuk/ResourceManager>
 #include "syncfile.h"
 
 namespace Soprano {
     class Node;
     class Statement;
+    class Model;
 }
 
 namespace Nepomuk {
@@ -40,7 +42,8 @@
         static int NextId;
     public :
         IdentificationProcess();
-        IdentificationProcess( const SyncFile & sf );
+        IdentificationProcess( const SyncFile & sf,
+                               Soprano::Model * model = \
Nepomuk::ResourceManager::instance()->mainModel() );  
         struct ResourceStruct {
             QUrl uri;
@@ -63,9 +66,12 @@
         
         bool done() const;
 
+        Soprano::Model * model() const;
+
     private:
         SyncFile m_syncFile;
         int m_id;
+        Soprano::Model * m_model;
         
         void load( QList<Soprano::Statement>& allStatements );
     };
--- trunk/playground/base/nepomuk-kde/backupsync/service/identifier.cpp \
#1134920:1134921 @@ -19,6 +19,7 @@
 
 #include "identifier.h"
 #include "identificationprocess.h"
+#include "mergerequest.h"
 
 #include <QtCore/QMutexLocker>
 #include <QtCore/QHashIterator>
@@ -32,15 +33,13 @@
 Nepomuk::Identifier::Identifier(QObject* parent): QThread(parent)
 {
     start();
-
-    m_model = Nepomuk::ResourceManager::instance()->mainModel();
 }
 
 
 Nepomuk::Identifier::~Identifier()
 {
-    stop();
-    quit();
+    //stop();
+    //quit();
 }
 
 
@@ -87,8 +86,13 @@
 
             identifyAll( ip );
             LogFile lf = ip.convert();
-            emit processed( lf );
+            if( !lf.empty() ) {
+                kDebug() << "sending MergeRequest";
+                MergeRequest mergeRequest( lf, ip.model() );
+                emit processed( mergeRequest );
+            }
 
+
             if( !ip.done() ) {
                 QMutexLocker lock( &m_processMutex );
                 m_processes[ ip.id() ] = ip;
@@ -167,7 +171,7 @@
     //
     //Perform the query
     //
-    Soprano::QueryResultIterator iter = m_model->executeQuery( query, \
Soprano::Query::QueryLanguageSparql ); +    Soprano::QueryResultIterator iter = \
ip.model()->executeQuery( query, Soprano::Query::QueryLanguageSparql );  
     if( iter.next() ) {
         newUri = iter[ "r" ].uri();
@@ -201,7 +205,7 @@
         QString query = QString( "select ?r where { ?r nie:url %1 . }" )
                         .arg( Soprano::Node( oldUri ).toN3() );
 
-        Soprano::QueryResultIterator it = m_model->executeQuery( query, \
Soprano::Query::QueryLanguageSparql ); +        Soprano::QueryResultIterator it = \
ip.model()->executeQuery( query, Soprano::Query::QueryLanguageSparql );  
         if( it.next() ) {
             ip.hash[ oldUri ] = it["r"].uri();
@@ -223,11 +227,4 @@
     return true;
 }
 
-
-//TODO: Possible set mutexes for m_model
-void Nepomuk::Identifier::setModel(Soprano::Model* model)
-{
-    m_model = model;
-}
-
 #include "identifier.moc"
--- trunk/playground/base/nepomuk-kde/backupsync/service/identifier.h \
#1134920:1134921 @@ -38,6 +38,7 @@
     class IdentificationProcess;
     class SyncFile;
     class LogFile;
+    class MergeRequest;
 
     class Identifier : public QThread
     {
@@ -51,7 +52,7 @@
     Q_SIGNALS:
         Q_SCRIPTABLE void identified( int id, const QUrl & oldUri, const QUrl & \
newUri );  Q_SCRIPTABLE void notIdentified( int id, const QUrl & uri );
-        void processed( const LogFile & lf );
+        void processed( const MergeRequest & mergeRequests );
 
     public Q_SLOTS:
         int process( const SyncFile & sf );
@@ -64,7 +65,6 @@
         Q_SCRIPTABLE bool identify( int id, const QUrl & oldUri, const QUrl & newUri \
);  
         void stop();
-        void setModel( Soprano::Model * model );
 
     protected:
         virtual void run();
@@ -79,8 +79,6 @@
         QHash< int, IdentificationProcess > m_processes;
         QMutex m_processMutex;
 
-        Soprano::Model * m_model;
-
         void identify( IdentificationProcess & ip, const QUrl & uri );
         void identifyAll( IdentificationProcess & ip );
     };
--- trunk/playground/base/nepomuk-kde/backupsync/service/logfile.cpp #1134920:1134921
@@ -36,6 +36,7 @@
 
 namespace {
 
+
     //TODO: Use Soprano Parser Plugin
     Soprano::Node fromN3(const QString & s)
     {
@@ -135,6 +136,7 @@
 
 
 //Log File
+
 Nepomuk::LogFile::LogFile()
     : d( new LogFileData )
 {
@@ -149,6 +151,19 @@
 }
 
 
+Nepomuk::LogFile::LogFile(const Nepomuk::LogFile& rhs)
+    : d( rhs.d )
+{
+    kDebug() << "Copy constructor";
+}
+
+
+Nepomuk::LogFile::~LogFile()
+{
+
+}
+
+
 bool Nepomuk::LogFile::load()
 {
     return load( d->m_url );
@@ -335,70 +350,4 @@
 	m_Records = final;
 	sort();
 }
-*/
-/*
-bool compare(const Record &l, const Record & r) {
-	//Compares both. If comparable returns true.
-	if( l.added != r.added )
-		return false;
-
-	if( l.st.subject() != r.st.subject() )
-		return false;
-	// Subject might not match on different systems as URI's are different.
-	// need to run through the identifier first.
-
-	if( l.st.predicate() != r.st.predicate() )
-		return false;
-
-	return true;
-}
-
-void resolve(QList<Record> & list)
-{
-	Q_UNUSED(list);
-	//Record & r1 = list[i];
-	//Record & r2 = list[j];
-
-	//if( r1.dateTime > r2.dateTime ) {
-	//}
-}
-
-void LogFile::merge ( const LogFile& lf )
-{
-	QList<Record> list;
-	list.append(m_Records);
-	list.append(lf.m_Records);
-
-	QList<Record> temp;
-	QList<Record> final;
-	while( list.empty() == false )
-	{
-		Record r = list.front();
-		list.pop_front();
-
-		temp.push_back(r);
-
-		QMutableListIterator<Record> j(list);
-		while( j.hasNext() )
-		{
-			Record e = j.next();
-			if( compare(r, e) ) {
-				j.remove();
-				temp.push_back(e);
-			}
-		}
-
-		//Perform whatever resolution actions and add to final
-		//qSort(temp);
-		//final.push_back( temp.back() );
-		resolve(temp);
-		final.push_back( temp.front() );
-
-		temp.clear();
-	}
-
-	//list contains merged after resolution.
-	m_Records = list;
-}
-*/
-
+*/
\ No newline at end of file
--- trunk/playground/base/nepomuk-kde/backupsync/service/logfile.h #1134920:1134921
@@ -64,6 +64,8 @@
     public :
         LogFile();
         LogFile( const QUrl& url );
+        LogFile( const LogFile & rhs );
+        virtual ~LogFile();
 
         int size();
 
@@ -120,4 +122,6 @@
 
 }
 
+Q_DECLARE_METATYPE( Nepomuk::LogFile );
+
 #endif // LOGFILE_H
--- trunk/playground/base/nepomuk-kde/backupsync/service/merger.cpp #1134920:1134921
@@ -41,17 +41,15 @@
     : QThread( parent )
 {
     start();
-
-    setModel( Nepomuk::ResourceManager::instance()->mainModel() );
 }
 
 
 Nepomuk::Merger::~Merger()
 {
-    stop();
+    //stop();
     // Doesn't quit just stop the event loop? Since there isn't any
     // event loop this call is useless
-    quit();
+    //quit();
 }
 
 
@@ -62,13 +60,12 @@
 }
 
 
-int Nepomuk::Merger::merge(const Nepomuk::LogFile& lf)
+int Nepomuk::Merger::merge(const Nepomuk::MergeRequest & mergeRequest )
 {
     m_queueMutex.lock();
 
-    MergeRequest mr( lf );
-    int id = mr.id();
-    m_queue.enqueue( mr );
+    int id = mergeRequest.id();
+    m_queue.enqueue( mergeRequest );
 
     m_queueMutex.unlock();
     m_queueWaiter.wakeAll();
@@ -192,7 +189,7 @@
         QUrl propertyUri = st.predicate().uri();
         Soprano::Node object = st.object();
 
-        Nepomuk::Resource res( resourceUri, QUrl(), m_resourceManger );
+        Nepomuk::Resource res( resourceUri, QUrl(), mr.resourceManager() );
 
         if( r.added ) {
             res.setProperty( propertyUri, Nepomuk::Variant::fromNode( object ) );
@@ -219,11 +216,4 @@
 }
 
 
-void Nepomuk::Merger::setModel(Soprano::Model* model)
-{
-    m_model = model;
-    m_resourceManger = Nepomuk::ResourceManager::createManagerForModel( m_model );
-}
-
-
 #include "merger.moc"
\ No newline at end of file
--- trunk/playground/base/nepomuk-kde/backupsync/service/merger.h #1134920:1134921
@@ -37,6 +37,7 @@
 
     class LogFile;
     class ResourceManager;
+    class MergeRequest;
 
     class Merger : public QThread
     {
@@ -49,11 +50,9 @@
         void stop();
 
     public Q_SLOTS:
-        int merge( const LogFile & lf );
+        int merge( const MergeRequest & mergeRequest );
         void merge( int id, const Record & theirRecord, const Record & ownRecord );
 
-        void setModel( Soprano::Model * model );
-
     Q_SIGNALS:
         void notMerged( int id, const Record & theirRecord, const Record & ownRecord \
);  
@@ -70,9 +69,6 @@
         QHash<int, MergeRequest> m_processes;
         QMutex m_processMutex;
 
-        Soprano::Model * m_model;
-        Nepomuk::ResourceManager* m_resourceManger;
-
         void merge( MergeRequest & mr );
     };
 
--- trunk/playground/base/nepomuk-kde/backupsync/service/mergerequest.cpp \
#1134920:1134921 @@ -37,22 +37,44 @@
 }
 
 
-Nepomuk::MergeRequest::MergeRequest(const Nepomuk::LogFile& lf)
-    : m_id( NextId++ )
+Nepomuk::MergeRequest::MergeRequest(const Nepomuk::LogFile& lf, Soprano::Model* \
model) +    : m_id( NextId++ ),
+      m_model( model )
 {
     hash = makeHash( lf.allRecords() );
+    // The records are stored according to dateTime
 
-    // The records are stored according to dateTime
+    const QList<Record>& allRecords = lf.allRecords();
+    if( !allRecords.empty() ) {
     m_minDateTime = lf.allRecords().first().dateTime;
 }
+    else {
+        //TODO: Set min date time
+        m_minDateTime = QDateTime( QDate( 2000, 1, 1), QTime() );
+    }
 
+    Nepomuk::ResourceManager * mainManager = Nepomuk::ResourceManager::instance();
+    if( model == mainManager->mainModel() ) {
+        m_resourceManager = mainManager;
+    }
+    else {
+        m_resourceManager = Nepomuk::ResourceManager::createManagerForModel( m_model \
); +    }
 
+}
+
+
 Nepomuk::MergeRequest::MergeRequest()
 {
     m_id = -1;
 }
 
 
+Nepomuk::MergeRequest::~MergeRequest()
+{
+}
+
+
 int Nepomuk::MergeRequest::id() const
 {
     return m_id;
@@ -70,4 +92,14 @@
     return m_minDateTime;
 }
 
+Soprano::Model* Nepomuk::MergeRequest::model() const
+{
+    return m_model;
+}
 
+
+Nepomuk::ResourceManager* Nepomuk::MergeRequest::resourceManager() const
+{
+    return m_resourceManager;
+}
+
--- trunk/playground/base/nepomuk-kde/backupsync/service/mergerequest.h \
#1134920:1134921 @@ -25,8 +25,14 @@
 #include <QtCore/QMultiHash>
 #include <QtCore/QDateTime>
 
+#include <Nepomuk/ResourceManager>
+
 class Record;
 
+namespace Soprano {
+    class Model;
+}
+
 namespace Nepomuk {
 
     class LogFile;
@@ -34,8 +40,10 @@
     class MergeRequest
     {
     public :
-        MergeRequest( const LogFile & lf );
+        MergeRequest( const LogFile & lf,
+                      Soprano::Model * model = \
Nepomuk::ResourceManager::instance()->mainModel() );  MergeRequest();
+        virtual ~MergeRequest();
 
         typedef QPair<QUrl, QUrl> SPPair;
         typedef QMultiHash<SPPair, Record> MergeHash;
@@ -47,16 +55,25 @@
 
         MergeHash hash;
 
+        Soprano::Model * model() const;
+        Nepomuk::ResourceManager * resourceManager() const;
+
     private :
         int m_id;
         static int NextId;
 
         QDateTime m_minDateTime;
 
+        Soprano::Model * m_model;
+        Nepomuk::ResourceManager * m_resourceManager;
+
     public :
         static MergeHash makeHash( const QList<Record> & records );
     };
 
 }
 
+//Q_DECLARE_METATYPE( Nepomuk::MergeRequest );
+
+
 #endif // MERGEREQUEST_H
--- trunk/playground/base/nepomuk-kde/backupsync/service/syncmanager.cpp \
#1134920:1134921 @@ -21,6 +21,7 @@
 #include "identifier.h"
 #include "merger.h"
 #include "syncfile.h"
+#include "mergerequest.h"
 
 #include <QtDBus/QDBusConnection>
 
@@ -29,8 +30,8 @@
       m_identifier( ident ),
       m_merger( merger )
 {
-    connect( m_identifier, SIGNAL( processed( LogFile ) ),
-             m_merger, SLOT( merge( LogFile ) ) );
+    connect( m_identifier, SIGNAL( processed( MergeRequest ) ),
+             m_merger, SLOT( merge( MergeRequest ) ) );
 
     // Register DBus Object
     QDBusConnection con = QDBusConnection::sessionBus();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic