package com.netifera.platform.kernel.internal.probe; import com.netifera.platform.api.log.ILogger; import com.netifera.platform.api.model.AbstractEntity; import com.netifera.platform.api.model.IWorkspace; import com.netifera.platform.api.probe.IProbe; import com.netifera.platform.model.IUpdateRecord; import com.netifera.platform.model.ModelUpdate; import com.netifera.platform.model.ProbeEntity; public class ModelSyncClient { private final IWorkspace workspace; private final IProbe probe; private final ILogger logger; ModelSyncClient(IProbe probe, IWorkspace workspace, ILogger logger) { this.probe = probe; this.workspace = workspace; this.logger = logger; } void processModelUpdate(ModelUpdate updateMessage) { final ProbeEntity probeEntity = (ProbeEntity) probe.getEntity(); for(IUpdateRecord update : updateMessage.getUpdateRecords()) { processUpdate(update); if(update.getUpdateIndex() != probeEntity.getUpdateIndex()) { logger.warning("Unexpected update index received: " + update.getUpdateIndex() + " expecting " + probeEntity.getUpdateIndex()); return; } probeEntity.incrementUpdateIndex(1); } probeEntity.save(); } private void processUpdate(IUpdateRecord update) { final AbstractEntity localEntity = (AbstractEntity) workspace.findById(update.getEntity().getId()); if(localEntity == null) { createEntity(update); } else { updateEntity(localEntity, update); } } private void createEntity(IUpdateRecord update) { final AbstractEntity remoteEntity = (AbstractEntity) update.getEntity(); remoteEntity.setWorkspace(workspace); if((remoteEntity.getRealmId() & 0xFFFFFFFFL) == 1) { // hack to detect local probe realm logger.debug("Setting realm for entity " + remoteEntity + " to " + probe.getEntity().getId()); remoteEntity.setRealmId(probe.getEntity().getId()); } remoteEntity.save(); if(update.isAddedToSpace()) { remoteEntity.addToSpace(update.getSpaceId()); } } private void updateEntity(AbstractEntity localEntity, IUpdateRecord update) { localEntity.updateFromEntity(update.getEntity()); if(update.isAddedToSpace()) { localEntity.addToSpace(update.getSpaceId()); } } }