/** * this is the heart of the storage,<p> * It control all the in coming commands.<p> * The method does the following<p> * 1. validate the command<p> * 2. update the version number and the conflict number (if needed)<p> * 3. push the command to the command queue<p> */ public void consume(Command command) { // update schema and coreManagerKey in command in case that the schema or coreManagerKey fields in the command are null if(command.GetSchemaId()<0){ command.setSchemaId(getSessionMetaData().getSchemaId()); } if(command.GetCoreManagerKey()==null){ command.setCoreManagerKey(getCoreManager().getKey()); } // you do not have to handle your messages which NetworkProtocolType is multicast // because you have already handle them NetworkProtocolType type = command.getNetworkProtocolType(); if(type!=null && isCast(type) && command.GetCoreManagerKey().Equals(getCoreManager().getKey())&&sessionMetaData.GetSessionId()==command.GetSessionId()){ return; } //TODO validate message if(command.isModeCommand()||command.isAtomicModelCommand()){ // model change commands // set version number or distribute if(command.getVersion()<0){ distributionManager.produceTcp(command); int version = command.getVersion(); // return if command is lock or something was wrong if(version<0|| command.isNotSucceed()){ return; } } if(command.isAtomicModelCommand()){ List<Command> commands = command.getCommands(); atomicContainer.register(command,commands); foreach (Command newCommand in commands) { commandQueue.pushCommand(newCommand); } }else{ commandQueue.pushCommand(command); } }else{ Int32 commandType = command.getCommandType(); if(commandType==PlanckDBConstants.READ_LOCK_COMMAND){ if( ! command.GetCoreManagerKey().Equals(coreManager.getKey())){ List<Command> commands=command.getCommands(); bool entityLock=command.isLocked(); foreach (Command newCommand in commands) { int entityId=newCommand.getEntityId(); int ownerId=newCommand.getOwnerId(); if(entityLock){ registry.lockEntity(entityId,true,ownerId); }else{ registry.lockEntity(entityId,false,PlanckDBConstants.NON_ENTITY_OWNER); } } }else{ distributionManager.produceTcp(command); } } } }