/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.communication.internal; import de.rcenvironment.core.communication.api.NodeIdentifierService; import de.rcenvironment.core.communication.api.PlatformService; import de.rcenvironment.core.communication.common.CommonIdBase; import de.rcenvironment.core.communication.common.InstanceNodeId; import de.rcenvironment.core.communication.common.InstanceNodeSessionId; import de.rcenvironment.core.communication.common.LogicalNodeId; import de.rcenvironment.core.communication.common.LogicalNodeSessionId; import de.rcenvironment.core.communication.common.ResolvableNodeId; import de.rcenvironment.core.communication.configuration.NodeConfigurationService; import de.rcenvironment.core.communication.model.InitialNodeInformation; import de.rcenvironment.core.utils.common.security.AllowRemoteAccess; import de.rcenvironment.core.utils.incubator.Assertions; import de.rcenvironment.toolkit.utils.common.IdGenerator; /** * Implementation of {@link PlatformService}. * * @author Doreen Seider * @author Robert Mischke */ public class PlatformServiceImpl implements PlatformService { private InitialNodeInformation localInitialNodeInformation; private InstanceNodeSessionId localInstanceSessionId; private LogicalNodeSessionId localDefaultLogicalNodeSessionId; private NodeConfigurationService nodeConfigurationService; private InstanceNodeId localInstanceId; private LogicalNodeId localDefaultLogicalNodeId; // private final Log log = LogFactory.getLog(getClass()); /** * Initialization; called by OSGi-DS and integration tests. */ public void activate() { localInitialNodeInformation = nodeConfigurationService.getInitialNodeInformation(); // perform all conversions once as they may be fetched frequently localInstanceSessionId = localInitialNodeInformation.getInstanceNodeSessionId(); localInstanceId = localInstanceSessionId.convertToInstanceNodeId(); localDefaultLogicalNodeId = localInstanceSessionId.convertToDefaultLogicalNodeId(); localDefaultLogicalNodeSessionId = localInstanceSessionId.convertToDefaultLogicalNodeSessionId(); // register a preliminary name for proper log output (instead of <unknown> or similar); this is replaced with the // actual display name when the local node receives the callback for its own node properties (as from any other node) final NodeIdentifierService nodeIdentifierService = nodeConfigurationService.getNodeIdentifierService(); nodeIdentifierService.associateDisplayName(localInstanceSessionId, "<local instance>"); } /** * OSGi-DS bind method; made public for integration testing. * * @param newInstance the new service instance */ public void bindNodeConfigurationService(NodeConfigurationService newInstance) { nodeConfigurationService = newInstance; } @Override public InstanceNodeId getLocalInstanceNodeId() { return localInstanceId; } @Override @AllowRemoteAccess public InstanceNodeSessionId getLocalInstanceNodeSessionId() { return localInstanceSessionId; } @Override public LogicalNodeId getLocalDefaultLogicalNodeId() { return localDefaultLogicalNodeId; } @Override public LogicalNodeSessionId getLocalDefaultLogicalNodeSessionId() { return localDefaultLogicalNodeSessionId; } @Override public LogicalNodeId createRecognizableLocalLogicalNodeId(String qualifier) { return localInstanceId.expandToLogicalNodeId(CommonIdBase.RECOGNIZABLE_LOGICAL_NODE_PART_PREFIX + qualifier); } @Override public LogicalNodeId createTransientLocalLogicalNodeId() { // FIXME not collision-free at all, only for testing; restricted to not require DM field adaptations (36 chars) return localInstanceId.expandToLogicalNodeId(CommonIdBase.TRANSIENT_LOGICAL_NODE_PART_PREFIX + IdGenerator.fastRandomHexString(2)); } @Override public boolean matchesLocalInstance(ResolvableNodeId identifier) { Assertions.isDefined(identifier, "NodeIdentifier must not be null."); // TODO >=8.0: review whether this is the best possible implementation considering possible InstanceId collisionss - misc_ro return localInitialNodeInformation.getInstanceNodeSessionId().isSameInstanceNodeAs(identifier); } }