//added by Cristian.Guef
int NodesRepository::Add(const DevicePtr& node)
{
	if (!nodesByMAC.insert(NodesByMACT::value_type(node->Mac(), node)).second)
	{
		LOG_WARN("Same MAC:" << node->Mac().ToString() << "was detected (will be ignored)!");
		return 0;
	}
	return 1;
}
AbstractAppCommandPtr AppCommandsFactory::Create(DBCommand& command, DevicesManager& devices)
{
	LOG_DEBUG_APP("[AppCommand]: create for db command:" << command);

	switch ( command.commandCode )
	{
	case DBCommand::ccGetTopology:
		CheckUsrCmdInputVal(devices).TestUsrParams_ccGetTopology(command);
		return AbstractAppCommandPtr(new AppTopologyCommand());

	case DBCommand::ccNotifSubscribe:
	{
		DevicePtr dev;
		CheckUsrCmdInputVal(devices).TestUsrParams_ccNotifSubscribe(command, dev);
		return AbstractAppCommandPtr(new AppSetBurstNotificationCmd(dev->GetPublisherInfo().channelList, 
			dev->GetPublisherInfo().burstMessageList, dev->GetPublisherInfo().triggersList));
	}
	case DBCommand::ccNotifUnSubscribe:
		CheckUsrCmdInputVal(devices).TestUsrParams_ccNotifUnSubscribe(command);
		return AbstractAppCommandPtr(new AppUnsetBurstNotificationCmd());
	
	case DBCommand::ccTopologyNotify:
		CheckUsrCmdInputVal(devices).TestUsrParams_ccTopologyNotify(command);
		return AbstractAppCommandPtr(new AppSetTopoNotificationCmd());

	case DBCommand::ccGeneralCmd:
	{
		int retValueCmdNo;  /* cmdNo */
		std::string retValueDataBytes; /* dataBytes */ 
		bool bypassIOCache;
		CheckUsrCmdInputVal(devices).TestUsrParams_ccGeneralCmd(command, retValueCmdNo, retValueDataBytes, bypassIOCache);
		return AbstractAppCommandPtr(new AppGeneralCommand(retValueCmdNo, retValueDataBytes, command.commandID, command.deviceID, bypassIOCache));	
	}
	case DBCommand::ccReadValue:
		{
		/*compute the channel list for the req cmd*/
		PublishChannel channel;
		bool bypassIOCache;
		CheckUsrCmdInputVal(devices).TestUsrParams_ccReadValue(command, channel, bypassIOCache);
		PublishChannelSetT channelsSet;
		channelsSet.insert(channel);
		return AbstractAppCommandPtr(new AppReadValueCmd( channel.cmdNo, command.deviceID, DeviceReading::ReadValue, channelsSet, bypassIOCache));
		}
	case DBCommand::ccRoutesReport:
		return AbstractAppCommandPtr(new AppRoutesReportCmd(devices.RegisteredDevicesNo()));
	case DBCommand::ccServicesReport:
		return AbstractAppCommandPtr(new AppServicesReportCmd(devices.RegisteredDevicesNo()));
	case DBCommand::ccDeviceHealthReport:
	{
		std::list<std::pair<int, MAC> > devicesList;
		CheckUsrCmdInputVal(devices).TestUsrParams_ccDevHealthReport(command, devicesList);
		return AbstractAppCommandPtr(new AppDeviceHealthReportCmd(devicesList));
	}
	case DBCommand::ccSuperframesReport:
		return AbstractAppCommandPtr(new AppSuperframesReportCmd(devices.RegisteredDevicesNo()));
	case DBCommand::ccDeviceScheduleLinkReport:
	{
		std::list<std::pair<int,MAC> > devicesList;
		CheckUsrCmdInputVal(devices).TestUsrParams_ccDeviceScheduleLinkReport(command, devicesList);
		return AbstractAppCommandPtr(new AppDeviceScheduleLinksReportCmd(devicesList));
	}		
	case DBCommand::ccNeighborHealthReport:
	{
		std::list<std::pair<int, MAC> > devicesList;
		CheckUsrCmdInputVal(devices).TestUsrParams_ccNeighborHealthReport(command, devicesList);
		return AbstractAppCommandPtr(new AppNeighborHealthReportCmd(devicesList));
	}
	case DBCommand::ccAutodetectBurstsConfig:
	{
		DevicePtr dev;
		std::string pubConfFileName;
		CheckUsrCmdInputVal(devices).TestUsrParams_ccBurstConfiguration(command, dev, pubConfFileName);
		//for cancelling command
		dev->configBurstDBCmdID = command.commandID;
		return AbstractAppCommandPtr(new AppSetBurstConfigurationCmd(pubConfFileName, dev));
	}
    case DBCommand::ccReadBurstConfig:
    {
        DevicePtr dev;
        CheckUsrCmdInputVal(devices).TestUsrParams_ccReadBurstConfig(command, dev);
        MAC mac = dev->Mac();
        return AbstractAppCommandPtr(new AppDiscoveryBurstConfigCmd(mac));
    }
	default:
		break;
	}

	LOG_ERROR_APP("[AppCommand]: create with Unknown CommandCode=" << command.commandCode);
	THROW_EXCEPTION1(InvalidCommandException, "unknown command");
}