OpenWalnut  1.4.0
WDataHandler.cpp
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