/* * Copyright 2014-2016 CyberVision, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kaaproject.kaa.server.common.dao.service; import static org.kaaproject.kaa.server.common.dao.service.Validator.validateNotNull; import static org.kaaproject.kaa.server.common.dao.service.Validator.validateString; import org.kaaproject.kaa.common.dto.ConfigurationSchemaDto; import org.kaaproject.kaa.common.dto.EndpointProfileDto; import org.kaaproject.kaa.common.dto.EndpointSpecificConfigurationDto; import org.kaaproject.kaa.server.common.dao.ConfigurationService; import org.kaaproject.kaa.server.common.dao.EndpointService; import org.kaaproject.kaa.server.common.dao.EndpointSpecificConfigurationService; import org.kaaproject.kaa.server.common.dao.impl.EndpointSpecificConfigurationDao; import org.kaaproject.kaa.server.common.dao.model.EndpointSpecificConfiguration; import org.kaaproject.kaa.server.common.dao.model.ToDto; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Optional; @Service public class EndpointSpecificConfigurationServiceImpl implements EndpointSpecificConfigurationService { private static final Logger LOG = LoggerFactory.getLogger(EndpointSpecificConfigurationServiceImpl.class); private EndpointSpecificConfigurationDao<EndpointSpecificConfiguration> endpointSpecificConfigurationDao; @Autowired private EndpointService endpointService; @Autowired private ConfigurationService configurationService; @Override public Optional<EndpointSpecificConfigurationDto> findActiveConfigurationByEndpointKeyHash(byte[] endpointKeyHash) { LOG.debug("Looking for active endpoint specific configuration by EP key hash {}", endpointKeyHash); EndpointProfileDto profileDto = getEndpointProfileDto(endpointKeyHash); if (profileDto == null) { return Optional.empty(); } EndpointSpecificConfiguration configuration = endpointSpecificConfigurationDao.findByEndpointKeyHashAndConfigurationVersion(endpointKeyHash, profileDto.getConfigurationVersion()); return Optional.ofNullable(configuration).map(ToDto::toDto); } @Override public Optional<EndpointSpecificConfigurationDto> findByEndpointKeyHashAndConfSchemaVersion(byte[] endpointKeyHash, Integer confSchemaVersion) { LOG.debug("Looking for endpoint specific configuration by EP key hash {} and confSchemaVersion", endpointKeyHash, confSchemaVersion); validateNotNull(confSchemaVersion, "Configuration schema version is required"); EndpointProfileDto profileDto = getEndpointProfileDto(endpointKeyHash); if (profileDto == null) { return Optional.empty(); } validateConfSchemaVersion(profileDto.getApplicationId(), confSchemaVersion); EndpointSpecificConfiguration configuration = endpointSpecificConfigurationDao.findByEndpointKeyHashAndConfigurationVersion(endpointKeyHash, confSchemaVersion); return Optional.ofNullable(configuration).map(ToDto::toDto); } @Override public Optional<EndpointSpecificConfigurationDto> findActiveConfigurationByEndpointProfile(EndpointProfileDto endpointProfileDto) { byte[] endpointKeyHash = endpointProfileDto.getEndpointKeyHash(); int configurationVersion = endpointProfileDto.getConfigurationVersion(); EndpointSpecificConfiguration configuration = endpointSpecificConfigurationDao.findByEndpointKeyHashAndConfigurationVersion(endpointKeyHash, configurationVersion); return Optional.ofNullable(configuration).map(ToDto::toDto); } @Override public Optional<EndpointSpecificConfigurationDto> deleteActiveConfigurationByEndpointKeyHash(byte[] endpointKeyHash) { Optional<EndpointSpecificConfigurationDto> configuration = findActiveConfigurationByEndpointKeyHash(endpointKeyHash); if (configuration.isPresent()) { int confSchemaVersion = configuration.get().getConfigurationSchemaVersion(); endpointSpecificConfigurationDao.removeByEndpointKeyHashAndConfigurationVersion(endpointKeyHash, confSchemaVersion); } return configuration; } @Override public Optional<EndpointSpecificConfigurationDto> deleteByEndpointKeyHashAndConfSchemaVersion(byte[] endpointKeyHash, Integer confSchemaVersion) { Optional<EndpointSpecificConfigurationDto> configuration = findByEndpointKeyHashAndConfSchemaVersion(endpointKeyHash, confSchemaVersion); if (configuration.isPresent()) { endpointSpecificConfigurationDao.removeByEndpointKeyHashAndConfigurationVersion(endpointKeyHash, confSchemaVersion); } return configuration; } @Override public EndpointSpecificConfigurationDto save(EndpointSpecificConfigurationDto configurationDto) { EndpointProfileDto profileDto = getEndpointProfileDto(configurationDto.getEndpointKeyHash()); if (configurationDto.getConfigurationSchemaVersion() == null) { configurationDto.setConfigurationSchemaVersion(profileDto.getConfigurationVersion()); } validateEndpointSpecificConfiguration(configurationDto, profileDto.getApplicationId()); return endpointSpecificConfigurationDao.save(configurationDto).toDto(); } private EndpointProfileDto getEndpointProfileDto(byte[] endpointKeyHash) { validateNotNull(endpointKeyHash, "Endpoint key hash is required"); return endpointService.findEndpointProfileByKeyHash(endpointKeyHash); } private void validateEndpointSpecificConfiguration(EndpointSpecificConfigurationDto configurationDto, String appId) { validateString(configurationDto.getConfiguration(), "Endpoint specific configuration body is required"); int configurationVersion = configurationDto.getConfigurationSchemaVersion(); String configurationBody = configurationDto.getConfiguration(); configurationBody = configurationService.normalizeAccordingToOverrideConfigurationSchema(appId, configurationVersion, configurationBody); configurationDto.setConfiguration(configurationBody); } private void validateConfSchemaVersion(String appId, int schemaVersion) { ConfigurationSchemaDto confSchema = configurationService.findConfSchemaByAppIdAndVersion(appId, schemaVersion); validateNotNull(confSchema, "Configuration schema with provided version doesn't exists."); } public void setEndpointSpecificConfigurationDao(EndpointSpecificConfigurationDao<EndpointSpecificConfiguration> endpointSpecificConfigurationDao) { this.endpointSpecificConfigurationDao = endpointSpecificConfigurationDao; } public void setEndpointService(EndpointService endpointService) { this.endpointService = endpointService; } public void setConfigurationService(ConfigurationService configurationService) { this.configurationService = configurationService; } }