00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <algorithm>
00026 #include <string>
00027 #include <vector>
00028
00029 #include <boost/lexical_cast.hpp>
00030
00031 #include "WSubject.h"
00032 #include "exceptions/WDHNoSuchSubject.h"
00033
00034 #include "../common/WLogger.h"
00035
00036 #include "WDataHandler.h"
00037
00038
00039 boost::shared_ptr< WDataHandler > WDataHandler::m_instance = boost::shared_ptr< WDataHandler >();
00040
00041 WDataHandler::WDataHandler():
00042 m_subjects()
00043 {
00044 WLogger::getLogger()->addLogMessage( "Initializing Data Handler", "Data Handler", LL_INFO );
00045 addSubject( boost::shared_ptr< WSubject >( new WSubject( WPersonalInformation::createDummyInformation() ) ) );
00046 }
00047
00048 WDataHandler::~WDataHandler()
00049 {
00050 }
00051
00052 void WDataHandler::addSubject( boost::shared_ptr< WSubject > subject )
00053 {
00054 WLogger::getLogger()->addLogMessage( "Adding subject with ID \"" +
00055 boost::lexical_cast< std::string >( subject->getPersonalInformation().getSubjectID() ) + "\" and Name \""
00056 + subject->getName() + "\".",
00057 "Data Handler", LL_DEBUG );
00058
00059
00060 m_subjects.push_back( subject );
00061 }
00062
00063 void WDataHandler::removeSubject( boost::shared_ptr< WSubject > subject )
00064 {
00065 SubjectSharedContainerType::WriteTicket l = m_subjects.getWriteTicket();
00066
00067 WLogger::getLogger()->addLogMessage( "Removing subject with ID \"" +
00068 boost::lexical_cast< std::string >( subject->getPersonalInformation().getSubjectID() ) + "\" and Name \""
00069 + subject->getName() + "\".",
00070 "Data Handler", LL_DEBUG );
00071
00072
00073 for( SubjectContainerType::iterator iter = l->get().begin(); iter != l->get().end();
00074 ++iter )
00075 {
00076 if( ( *iter ) == subject )
00077 {
00078 l->get().erase( iter );
00079 break;
00080 }
00081 }
00082 }
00083
00084 void WDataHandler::clear()
00085 {
00086 SubjectSharedContainerType::WriteTicket l = m_subjects.getWriteTicket();
00087
00088 WLogger::getLogger()->addLogMessage( "Removing all subjects.", "Data Handler", LL_INFO );
00089
00090 for( SubjectContainerType::const_iterator iter = l->get().begin(); iter != l->get().end();
00091 ++iter )
00092 {
00093 WLogger::getLogger()->addLogMessage( "Removing subject \"" +
00094 boost::lexical_cast< std::string >( ( *iter )->getPersonalInformation().getSubjectID() ) + "\".",
00095 "Data Handler", LL_DEBUG );
00096
00097 ( *iter )->clear();
00098 }
00099
00100 l->get().clear();
00101 }
00102
00103 WDataHandler::SubjectSharedContainerType::ReadTicket WDataHandler::getSubjects() const
00104 {
00105 return m_subjects.getReadTicket();
00106 }
00107
00108 boost::shared_ptr< WSubject > WDataHandler::getSubjectByID( size_t subjectID )
00109 {
00110 SubjectSharedContainerType::ReadTicket l = m_subjects.getReadTicket();
00111
00112
00113 boost::shared_ptr< WSubject > result;
00114 try
00115 {
00116 if( subjectID < l->get().size() )
00117 {
00118 result = l->get().at( subjectID );
00119 }
00120 else
00121 {
00122 result = boost::shared_ptr< WSubject >();
00123 }
00124 }
00125 catch( const std::out_of_range& e )
00126 {
00127 throw WDHNoSuchSubject();
00128 }
00129
00130 return result;
00131 }
00132
00133 boost::shared_ptr< WDataHandler > WDataHandler::getDataHandler()
00134 {
00135 if( !m_instance )
00136 {
00137 m_instance = boost::shared_ptr< WDataHandler >( new WDataHandler() );
00138 }
00139
00140 return m_instance;
00141 }
00142
00143 boost::shared_ptr< WSubject > WDataHandler::getDefaultSubject()
00144 {
00145 return getDataHandler()->getSubjectByID( WSubject::SUBJECT_UNKNOWN );
00146 }
00147