OpenWalnut
1.4.0
|
00001 //--------------------------------------------------------------------------- 00002 // 00003 // Project: OpenWalnut ( http://www.openwalnut.org ) 00004 // 00005 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS 00006 // For more information see http://www.openwalnut.org/copying 00007 // 00008 // This file is part of OpenWalnut. 00009 // 00010 // OpenWalnut is free software: you can redistribute it and/or modify 00011 // it under the terms of the GNU Lesser General Public License as published by 00012 // the Free Software Foundation, either version 3 of the License, or 00013 // (at your option) any later version. 00014 // 00015 // OpenWalnut is distributed in the hope that it will be useful, 00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 // GNU Lesser General Public License for more details. 00019 // 00020 // You should have received a copy of the GNU Lesser General Public License 00021 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>. 00022 // 00023 //--------------------------------------------------------------------------- 00024 00025 #include <algorithm> 00026 #include <string> 00027 #include <vector> 00028 00029 00030 #include "WSubject.h" 00031 #include "exceptions/WDHNoSuchSubject.h" 00032 00033 #include "../common/WLogger.h" 00034 #include "../common/WStringUtils.h" 00035 00036 #include "WDataHandler.h" 00037 00038 // instance as singleton 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 string_utils::toString( subject->getPersonalInformation().getSubjectID() ) + "\" and Name \"" 00056 + subject->getName() + "\".", 00057 "Data Handler", LL_DEBUG ); 00058 00059 // simply add the new subject 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 string_utils::toString( subject->getPersonalInformation().getSubjectID() ) + "\" and Name \"" 00069 + subject->getName() + "\".", 00070 "Data Handler", LL_DEBUG ); 00071 00072 // iterate and find, remove 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 string_utils::toString( ( *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 // search it 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