#! /usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import with_statement

try:

    from omniORB import CORBA
    import omniORB

    omniORB.importIDL('./idl/forum.idl')

except:
    print "Failed to Initialise Corba"

import sys

from ForumAPI import Message, Reject
from ForumAPI__POA import Forum, ForumAdmin



class ForumImpl:

    def __init__(self, moderator, theme):
        self._modo = moderator
        self._theme = theme
        self._messages = {}
    
    def getMessage(self, title):
        if title in self._messages:
            return self._messages[title]
        else:
            raise Reject("Le message %s n'existe pas"%(title))

    def _get_moderator(self):
        return self._modo

    def postMessage(self, message):
        if not message.title in self._messages:
            self._messages[message.title] = message
            return True
        else:
            raise Reject("Le message %s existe déjà"%(message.title))

    def removeMessage(self, title):
        if title in self._messages:
            del self._messages[title]
            return True
        else:
            raise Reject("Le message %s n'existe pas"%(title))

    def _get_theme(self):
        return self._theme

    def getMessages(self):
        return self._messages.values()

    def getInfo(self):
        return self._theme, self._modo, len(self._messages)

    def _get_Theme(self):
        return self._theme

    def _get_Moderateur(self):
        return self._modo

    def _set_Theme(self, theme):
        self._theme = theme

    def _set_Moderateur(self,moderator):
        self._modo = moderator


def main(argv):

    orb = CORBA.ORB_init()

    root_poa = orb.resolve_initial_references("RootPOA")

    root_poa._get_the_POAManager().activate()

    forum_impl = ForumImpl('Guido van Rossum','Python')

    forum = Forum()
    forum_admin = ForumAdmin()

    #Delegation par introspection
    for method_name in dir(forum_impl):
        if not '__' == method_name[:2]:
            method = getattr(forum_impl,method_name)
            delegate_for = lambda x: setattr(x, method_name, method)
            delegate_for(forum)
            delegate_for(forum_admin)

    for file_name, poa_object in (('ObjectRef1', forum),
                                  ('ObjectRef2', forum_admin)):
        with(open(file_name,'w')) as file:
            poa_id = root_poa.activate_object(poa_object)
            poa_ref = root_poa.id_to_reference(poa_id)
            file.write(orb.object_to_string(poa_ref))

    orb.run()

if __name__ == '__main__':

    main(sys.argv) 

    
