예제 #1
0
	TopologyObject Topology::lookupObjectByPath( const vector<ObjectPathElement> & path, TopologyObjectId parent ) throw(){
		TopologyObjectId resultId = parent;
		TopologyObject result;
		for( size_t i = 0; i < path.size(); i++ ) {
			const ObjectPathElement & curComponent = path[i];
			//Lookup the corresponding relation and update resultId.
			TopologyType relationType = lookupTypeByName( curComponent.relationName );
			if( !relationType ) return TopologyObject();
			TopologyRelation relation = lookupRelation( resultId, relationType.id(), curComponent.name );
			if( !relation )  return TopologyObject();
			resultId = relation.child();
		}
		return lookupObjectById( resultId );
	}
    virtual void messageReceivedCB(std::shared_ptr<ServerClientMessage> msg, const char * message_data, uint64_t buffer_size) {

        NetworkForwarderRequestMessage reqMess;
        NetworkForwarderResponseMessage resMess;
        TopologyType type;
        TopologyObject object;
        TopologyRelation relation;
        TopologyAttribute attribute;
        uint64_t pos = 0;

        j_serialization::deserialize(reqMess, message_data, pos, buffer_size);

        switch(reqMess.request_type) {
            case NETWORK_FORWARDER_TOPOLOGY_TYPE_REGISTER: 
                type = topologyBackend->registerType(reqMess.name);

                if(type) {
                    resMess.id = (size_t) type.id();
                }
                else {
                    resMess.id = -1;
                }

                msg->isendResponse(&resMess);
                break;
            case NETWORK_FORWARDER_TOPOLOGY_TYPE_LOOKUP_BY_NAME: 
                type = topologyBackend->lookupTypeByName(reqMess.name);

                if(type) {
                    resMess.id = (size_t) type.id();
                }
                else {
                    resMess.id = -1;
                }

                msg->isendResponse(&resMess);
                break;
            case NETWORK_FORWARDER_TOPOLOGY_TYPE_LOOKUP_BY_ID: 
                type = topologyBackend->lookupTypeById(reqMess.id);

                if(type) {
                    resMess.name = type.name();
                }
                else {
                    //TODO: -1 als reserved keyword okay?
                    resMess.name = "-1";
                }

                msg->isendResponse(&resMess);
                break;

            case NETWORK_FORWARDER_TOPOLOGY_OBJECT_REGISTER:
                object = topologyBackend->registerObject(reqMess.id, reqMess.type, reqMess.name, reqMess.other);

                if(object) {
                    resMess.id = object.id();
                }
                else {
                    resMess.id = -1;
                }

                msg->isendResponse(&resMess);
                break;
            case NETWORK_FORWARDER_TOPOLOGY_OBJECT_LOOKUP:
                object = topologyBackend->lookupObjectById(reqMess.id);

                if(object) {
                    resMess.id = object.id();
                    resMess.type = object.type();
                }
                else {
                    resMess.id = -1;
                }

                msg->isendResponse(&resMess);
                break;

            case NETWORK_FORWARDER_TOPOLOGY_RELATION_REGISTER:
                relation = topologyBackend->registerRelation(reqMess.id, reqMess.type, reqMess.name, reqMess.other);

                if(relation) {
                    // Wont be read, but we'll send a success signal anyway
                    resMess.id = 0;
                }
                else {
                    resMess.id = -1;
                }

                msg->isendResponse(&resMess);
                break;       
            case NETWORK_FORWARDER_TOPOLOGY_RELATION_LOOKUP:
                relation = topologyBackend->lookupRelation(reqMess.id, reqMess.type, reqMess.name);

                if(relation) {
                    resMess.id = relation.child();
                }
                else {
                    resMess.id = -1;
                }

                msg->isendResponse(&resMess);
                break;    
            case NETWORK_FORWARDER_TOPOLOGY_ATTRIBUTE_REGISTER:
                attribute = topologyBackend->registerAttribute(reqMess.id, reqMess.name, (VariableDatatype::Type) reqMess.other);

                if(attribute) {
                    resMess.id = attribute.id();
                }
                else {
                    resMess.id = -1;
                }
                msg->isendResponse(&resMess);

                break;                       
            case NETWORK_FORWARDER_TOPOLOGY_ATTRIBUTE_LOOKUP_BY_NAME:
                attribute = topologyBackend->lookupAttributeByName(reqMess.id, reqMess.name);

                if(attribute) {
                    resMess.id = attribute.id();
                    resMess.other = (intmax_t) attribute.dataType();
                }
                else {
                    resMess.id = -1;
                }
                msg->isendResponse(&resMess);

                break;
    
            case NETWORK_FORWARDER_TOPOLOGY_ATTRIBUTE_LOOKUP_BY_ID:
                attribute = topologyBackend->lookupAttributeById(reqMess.id);

                if(attribute) {
                    resMess.name = attribute.name();
                    resMess.id = attribute.domainId();
                    resMess.other = (intmax_t) attribute.dataType();
                }
                else {
                    resMess.id = -1;
                }
                msg->isendResponse(&resMess);

                break;

            case NETWORK_FORWARDER_TOPOLOGY_ATTRIBUTE_SET:

                bool ret;

                ret = topologyBackend->setAttribute(reqMess.id, reqMess.type, reqMess.var);

                if(ret) {
                    resMess.id = 1;
                }
                else {
                    resMess.id = -1;
                }

                msg->isendResponse(&resMess);

                break;

            case NETWORK_FORWARDER_TOPOLOGY_ATTRIBUTE_GET:

                TopologyValue value = topologyBackend->getAttribute(reqMess.id, reqMess.type);

                if(value) {
                    resMess.id = 1;
                    resMess.var = value.value();
                }
                else {
                    resMess.id = -1;
                }
                msg->isendResponse(&resMess);

                break;                           
        }
    }