// **********************************************************************
// CosCompoundLifeCycle
// **********************************************************************

#ifndef CosCompoundLifeCycle_IDL
#define CosCompoundLifeCycle_IDL

//
// The Compound Life Cycle Service
//

#include <coss/CosLifeCycle.idl>
#include <coss/CosGraphs.idl>

#pragma prefix "omg.org"

module CosCompoundLifeCycle {
    interface OperationsFactory;
    interface Operations;
    interface Node;
    interface Role;
    interface Relationship;
    interface PropagationCriteriaFactory;

    enum Operation {copy, move, remove};

    struct RelationshipHandle {
	Relationship the_relationship;
        ::CosObjectIdentity::ObjectIdentifier constant_random_id;
    };

    interface OperationsFactory {
	Operations create_compound_operations();
    };

    interface Operations {
        Node copy (
    		in Node starting_node,
        	in ::CosLifeCycle::FactoryFinder there,
        	in ::CosLifeCycle::Criteria the_criteria)
    	    raises (::CosLifeCycle::NoFactory,
                    ::CosLifeCycle::NotCopyable,
                    ::CosLifeCycle::InvalidCriteria,
                    ::CosLifeCycle::CannotMeetCriteria);
        void move (
    		in Node starting_node,
                in ::CosLifeCycle::FactoryFinder there,
                in ::CosLifeCycle::Criteria the_criteria)
            raises (::CosLifeCycle::NoFactory,
                    ::CosLifeCycle::NotMovable,
                    ::CosLifeCycle::InvalidCriteria,
                    ::CosLifeCycle::CannotMeetCriteria);
        void remove (inout Node starting_node)
            raises (::CosLifeCycle::NotRemovable);
        void destroy();
    };

    interface Node : ::CosGraphs::Node {
        exception NotLifeCycleObject {};
        void copy_node ( in ::CosLifeCycle::FactoryFinder there,
                         in ::CosLifeCycle::Criteria the_criteria,
                         out Node new_node,
                         out Roles roles_of_new_node)
    	    raises (::CosLifeCycle::NoFactory,
        	    ::CosLifeCycle::NotCopyable,
            	    ::CosLifeCycle::InvalidCriteria,
                    ::CosLifeCycle::CannotMeetCriteria);
        void move_node (in ::CosLifeCycle::FactoryFinder there, 
                        in ::CosLifeCycle::Criteria the_criteria)
    	    raises (::CosLifeCycle::NoFactory,
                    ::CosLifeCycle::NotMovable,
                    ::CosLifeCycle::InvalidCriteria,
                    ::CosLifeCycle::CannotMeetCriteria);
        void remove_node ()
    	    raises (::CosLifeCycle::NotRemovable);
        ::CosLifeCycle::LifeCycleObject get_life_cycle_object()
    	    raises (NotLifeCycleObject);
    };

    interface Role : ::CosGraphs::Role {
        Role copy_role (in ::CosLifeCycle::FactoryFinder there, 
    			in ::CosLifeCycle::Criteria the_criteria)
            raises (::CosLifeCycle::NoFactory,
        	    ::CosLifeCycle::NotCopyable,
                    ::CosLifeCycle::InvalidCriteria,
                    ::CosLifeCycle::CannotMeetCriteria);
        void move_role (in ::CosLifeCycle::FactoryFinder there, 
                        in ::CosLifeCycle::Criteria the_criteria)
            raises (::CosLifeCycle::NoFactory,
                    ::CosLifeCycle::NotMovable,
                    ::CosLifeCycle::InvalidCriteria,
                    ::CosLifeCycle::CannotMeetCriteria);
        ::CosGraphs::PropagationValue life_cycle_propagation (
    			in Operation op,
                        in RelationshipHandle rel,
                        in ::CosRelationships::RoleName to_role_name,
                        out boolean same_for_all);
    };

    interface Relationship : ::CosRelationships::Relationship {
	Relationship copy_relationship (
                        in ::CosLifeCycle::FactoryFinder there,
                        in ::CosLifeCycle::Criteria the_criteria,
                        in ::CosGraphs::NamedRoles new_roles)
            raises (::CosLifeCycle::NoFactory,
                    ::CosLifeCycle::NotCopyable,
                    ::CosLifeCycle::InvalidCriteria,
                    ::CosLifeCycle::CannotMeetCriteria);
        void move_relationship (
                        in ::CosLifeCycle::FactoryFinder there,
                        in ::CosLifeCycle::Criteria the_criteria)
            raises (::CosLifeCycle::NoFactory,
                    ::CosLifeCycle::NotMovable,
                    ::CosLifeCycle::InvalidCriteria,
                    ::CosLifeCycle::CannotMeetCriteria);
        ::CosGraphs::PropagationValue life_cycle_propagation (
                	in Operation op,
                        in ::CosRelationships::RoleName from_role_name,
                        in ::CosRelationships::RoleName to_role_name,
                        out boolean same_for_all);
    };
    interface PropagationCriteriaFactory {
	::CosGraphs::TraversalCriteria create(in Operation op);
    };

};

#endif /* CosCompoundLifeCycle_IDL */
