2  * Copyright © 2017-2018 AT&T Intellectual Property.
\r 
   4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
\r 
   5  * in compliance with the License. You may obtain a copy of the License at
\r 
   7  * http://www.apache.org/licenses/LICENSE-2.0
\r 
   9  * Unless required by applicable law or agreed to in writing, software distributed under the License
\r 
  10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
\r 
  11  * or implied. See the License for the specific language governing permissions and limitations under
\r 
  15 package org.onap.ccsdk.config.data.adaptor.dao;
\r 
  17 import java.sql.ResultSet;
\r 
  18 import java.sql.SQLException;
\r 
  19 import java.util.ArrayList;
\r 
  20 import java.util.List;
\r 
  21 import org.apache.commons.lang3.StringUtils;
\r 
  22 import org.onap.ccsdk.config.data.adaptor.domain.ConfigResource;
\r 
  23 import org.onap.ccsdk.config.data.adaptor.domain.ResourceAssignmentData;
\r 
  24 import org.onap.ccsdk.sli.core.sli.SvcLogicException;
\r 
  25 import org.springframework.jdbc.core.JdbcTemplate;
\r 
  26 import org.springframework.jdbc.core.RowMapper;
\r 
  27 import org.springframework.jdbc.core.RowMapperResultSetExtractor;
\r 
  28 import com.att.eelf.configuration.EELFLogger;
\r 
  29 import com.att.eelf.configuration.EELFManager;
\r 
  31 public class ConfigResourceDaoImpl implements ConfigResourceDao {
\r 
  33     private static EELFLogger logger = EELFManager.getInstance().getLogger(ConfigResourceDaoImpl.class);
\r 
  35     private JdbcTemplate jdbcTemplate;
\r 
  37     public ConfigResourceDaoImpl(JdbcTemplate jdbcTemplate) {
\r 
  38         this.jdbcTemplate = jdbcTemplate;
\r 
  42     public ConfigResource save(ConfigResource configResource) throws SvcLogicException {
\r 
  44         ConfigResource dbConfigResource = checkConfigResource(configResource);
\r 
  46         if (dbConfigResource != null && StringUtils.isNotBlank(dbConfigResource.getConfigResourceId())) {
\r 
  47             configResource.setConfigResourceId(dbConfigResource.getConfigResourceId());
\r 
  49             validateConfigResource(configResource);
\r 
  51             update(configResource);
\r 
  53             saveConfigResourceAssignmentData(configResource);
\r 
  55             String addQuery = "INSERT INTO CONFIG_RESOURCE "
\r 
  56                     + "( config_resource_id, resource_id, resource_type, service_template_name, service_template_version,"
\r 
  57                     + "template_name, recipe_name, request_id, resource_data, mask_data, status, created_date, updated_by ) "
\r 
  58                     + "VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )";
\r 
  60             configResource.setConfigResourceId(configResource.getUniqueId());
\r 
  62             validateConfigResource(configResource);
\r 
  64             logger.info("saving config resource ({}) ...", configResource);
\r 
  65             jdbcTemplate.update(addQuery, configResource.getConfigResourceId(), configResource.getResourceId(),
\r 
  66                     configResource.getResourceType(), configResource.getServiceTemplateName(),
\r 
  67                     configResource.getServiceTemplateVersion(), configResource.getTemplateName(),
\r 
  68                     configResource.getRecipeName(), configResource.getRequestId(), configResource.getResourceData(),
\r 
  69                     configResource.getMaskData(), configResource.getStatus(), configResource.getCreatedDate(),
\r 
  70                     configResource.getUpdatedBy());
\r 
  72             saveConfigResourceAssignmentData(configResource);
\r 
  74         dbConfigResource = getConfigResource(configResource);
\r 
  75         return dbConfigResource;
\r 
  78     private void update(ConfigResource configResource) throws SvcLogicException {
\r 
  79         if (StringUtils.isNotBlank(configResource.getConfigResourceId())) {
\r 
  80             logger.info("updating config resource ({}) ...", configResource);
\r 
  81             // Added service_template_name and version in update query to update with 1802 data.
\r 
  82             String updateQuery = "UPDATE CONFIG_RESOURCE SET "
\r 
  83                     + "resource_data = ?, mask_data = ?, created_date = ?, updated_by = ? ,service_template_name = ?, service_template_version = ? "
\r 
  84                     + "where config_resource_id = ?";
\r 
  86             jdbcTemplate.update(updateQuery, configResource.getResourceData(), configResource.getMaskData(),
\r 
  87                     configResource.getCreatedDate(), configResource.getUpdatedBy(),
\r 
  88                     configResource.getServiceTemplateName(), configResource.getServiceTemplateVersion(),
\r 
  89                     configResource.getConfigResourceId());
\r 
  91             throw new SvcLogicException("missing config resource id to update.");
\r 
  95     private void saveConfigResourceAssignmentData(ConfigResource configResource) {
\r 
  96         if (configResource != null && StringUtils.isNotBlank(configResource.getConfigResourceId())) {
\r 
  97             List<Object> listOfArguments = new ArrayList<>();
\r 
  98             String deleteQuery = "DELETE FROM CONFIG_RESOURCE_ASSIGNMENT_DATA WHERE config_resource_id = ? ";
\r 
  99             listOfArguments.add(configResource.getConfigResourceId());
\r 
 100             this.jdbcTemplate.update(deleteQuery, listOfArguments.toArray());
\r 
 101             logger.info("config resource assignment data deleted successfully for the  config_resource_id ({})",
\r 
 102                     configResource.getConfigResourceId());
\r 
 104             if (configResource.getResourceAssignments() != null) {
\r 
 105                 List<ResourceAssignmentData> resourceAssignments = configResource.getResourceAssignments();
\r 
 106                 for (ResourceAssignmentData resourceAssignmentData : resourceAssignments) {
\r 
 107                     if (resourceAssignmentData != null) {
\r 
 108                         resourceAssignmentData.setConfigResourceId(configResource.getConfigResourceId());
\r 
 109                         saveResourceAssignmentData(resourceAssignmentData);
\r 
 116     private ResourceAssignmentData saveResourceAssignmentData(ResourceAssignmentData resourceAssignmentData) {
\r 
 117         String addQuery = "INSERT INTO CONFIG_RESOURCE_ASSIGNMENT_DATA "
\r 
 118                 + "( config_resource_assignment_data_id, config_resource_id, version, updated_by, template_key_name, "
\r 
 119                 + "resource_name, data_type, entry_schema, resource_value, source, status, message ) "
\r 
 120                 + "VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )";
\r 
 122         logger.debug("saving config resource assignment data ({}) ... ", resourceAssignmentData);
\r 
 123         jdbcTemplate.update(addQuery, resourceAssignmentData.getId(), resourceAssignmentData.getConfigResourceId(),
\r 
 124                 resourceAssignmentData.getVersion(), resourceAssignmentData.getUpdatedBy(),
\r 
 125                 resourceAssignmentData.getTemplateKeyName(), resourceAssignmentData.getResourceName(),
\r 
 126                 resourceAssignmentData.getDataType(), resourceAssignmentData.getEntrySchema(),
\r 
 127                 resourceAssignmentData.getResourceValue(), resourceAssignmentData.getSource(),
\r 
 128                 resourceAssignmentData.getStatus(), resourceAssignmentData.getMessage());
\r 
 130         return resourceAssignmentData;
\r 
 134     public void deleteByConfigResource(ConfigResource configResourceInput) throws SvcLogicException {
\r 
 135         StringBuilder selectArtifactBuffer = new StringBuilder();
\r 
 136         List<Object> listOfArguments = new ArrayList<>();
\r 
 138         selectArtifactBuffer.append("DELETE FROM CONFIG_RESOURCE WHERE config_resource_id = ? ");
\r 
 139         listOfArguments.add(configResourceInput.getConfigResourceId());
\r 
 141         String queryString = selectArtifactBuffer.toString();
\r 
 142         this.jdbcTemplate.update(queryString, listOfArguments.toArray());
\r 
 143         logger.info("config resource ({}) deleted successfully ", configResourceInput);
\r 
 146     @SuppressWarnings("squid:S3776")
\r 
 148     public List<ConfigResource> findByConfigResource(ConfigResource configResourceInput) throws SvcLogicException {
\r 
 149         StringBuilder selectArtifactBuffer = new StringBuilder();
\r 
 150         List<Object> listOfArguments = new ArrayList<>();
\r 
 152         selectArtifactBuffer.append("SELECT * FROM CONFIG_RESOURCE WHERE ");
\r 
 154         StringBuilder whereClauseRemaining = new StringBuilder();
\r 
 156         if (configResourceInput.getServiceTemplateName() != null) {
\r 
 157             if (whereClauseRemaining.length() != 0) {
\r 
 158                 whereClauseRemaining.append("AND ");
\r 
 160             whereClauseRemaining.append("service_template_name = ? ");
\r 
 161             listOfArguments.add(configResourceInput.getServiceTemplateName());
\r 
 164         if (configResourceInput.getServiceTemplateVersion() != null) {
\r 
 165             if (whereClauseRemaining.length() != 0) {
\r 
 166                 whereClauseRemaining.append("AND ");
\r 
 168             whereClauseRemaining.append("service_template_version = ? ");
\r 
 169             listOfArguments.add(configResourceInput.getServiceTemplateVersion());
\r 
 172         if (configResourceInput.getResourceId() != null) {
\r 
 173             if (whereClauseRemaining.length() != 0) {
\r 
 174                 whereClauseRemaining.append("AND ");
\r 
 176             whereClauseRemaining.append("resource_id = ? ");
\r 
 177             listOfArguments.add(configResourceInput.getResourceId());
\r 
 180         if (configResourceInput.getResourceType() != null) {
\r 
 181             if (whereClauseRemaining.length() != 0) {
\r 
 182                 whereClauseRemaining.append("AND ");
\r 
 184             whereClauseRemaining.append("resource_type = ? ");
\r 
 185             listOfArguments.add(configResourceInput.getResourceType());
\r 
 188         if (configResourceInput.getRequestId() != null) {
\r 
 189             if (whereClauseRemaining.length() != 0) {
\r 
 190                 whereClauseRemaining.append("AND ");
\r 
 192             whereClauseRemaining.append("request_id = ? ");
\r 
 193             listOfArguments.add(configResourceInput.getRequestId());
\r 
 196         if (configResourceInput.getTemplateName() != null) {
\r 
 197             if (whereClauseRemaining.length() != 0) {
\r 
 198                 whereClauseRemaining.append("AND ");
\r 
 200             whereClauseRemaining.append("template_name = ? ");
\r 
 201             listOfArguments.add(configResourceInput.getTemplateName());
\r 
 204         if (configResourceInput.getRecipeName() != null) {
\r 
 205             if (whereClauseRemaining.length() != 0) {
\r 
 206                 whereClauseRemaining.append("AND ");
\r 
 208             whereClauseRemaining.append("recipe_name = ? ");
\r 
 209             listOfArguments.add(configResourceInput.getRecipeName());
\r 
 212         String queryString = selectArtifactBuffer.toString() + whereClauseRemaining.toString();
\r 
 213         logger.info("config resource queryString ({})", queryString);
\r 
 214         List<ConfigResource> configResources =
\r 
 215                 this.jdbcTemplate.query(queryString, listOfArguments.toArray(), new ConfigResourceMapper());
\r 
 217         List<ConfigResource> returnConfigResources = new ArrayList<>();
\r 
 219         if (configResources != null) {
\r 
 220             for (ConfigResource configResource : configResources) {
\r 
 221                 if (configResource != null) {
\r 
 222                     returnConfigResources.add(getConfigResource(configResource));
\r 
 226         return returnConfigResources;
\r 
 229     public ConfigResource checkConfigResource(ConfigResource configResource) {
\r 
 230         StringBuilder selectBuffer = new StringBuilder();
\r 
 231         List<Object> listOfArguments = new ArrayList<>();
\r 
 233         selectBuffer.append(
\r 
 234                 "SELECT * FROM CONFIG_RESOURCE WHERE resource_id = ? AND resource_type = ? AND template_name = ? ");
\r 
 235         listOfArguments.add(configResource.getResourceId());
\r 
 236         listOfArguments.add(configResource.getResourceType());
\r 
 237         listOfArguments.add(configResource.getTemplateName());
\r 
 238         return queryOneForObject(selectBuffer.toString(), listOfArguments.toArray(), new ConfigResourceMapper());
\r 
 242     public ConfigResource getConfigResource(ConfigResource configResource) throws SvcLogicException {
\r 
 243         ConfigResource dbConfigResource = checkConfigResource(configResource);
\r 
 244         if (dbConfigResource != null && StringUtils.isNotBlank(dbConfigResource.getConfigResourceId())) {
\r 
 245             List<ResourceAssignmentData> resourceAssignments =
\r 
 246                     getResourceAssignmentdata(dbConfigResource.getConfigResourceId());
\r 
 247             configResource.setResourceAssignments(resourceAssignments);
\r 
 249         return configResource;
\r 
 252     private List<ResourceAssignmentData> getResourceAssignmentdata(String configResourceId) {
\r 
 253         List<Object> listOfArguments = new ArrayList<>();
\r 
 254         String queryString = "SELECT * FROM CONFIG_RESOURCE_ASSIGNMENT_DATA WHERE config_resource_id = ? ";
\r 
 255         logger.info("getResourceAssignmentdata queryString ({}), query inputs ({})", queryString, configResourceId);
\r 
 256         listOfArguments.add(configResourceId);
\r 
 257         return this.jdbcTemplate.query(queryString, listOfArguments.toArray(), new ResourceAssignmentDataMapper());
\r 
 260     @SuppressWarnings("squid:S3776")
\r 
 261     private boolean validateConfigResource(ConfigResource configResource) throws SvcLogicException {
\r 
 262         if (configResource == null) {
\r 
 263             throw new SvcLogicException("config resource information is missing.");
\r 
 266         if (StringUtils.isBlank(configResource.getConfigResourceId())) {
\r 
 267             throw new SvcLogicException("config resource id is missing.");
\r 
 270         if (StringUtils.isBlank(configResource.getResourceType())) {
\r 
 271             throw new SvcLogicException("config resource type is missing.");
\r 
 273         if (StringUtils.isBlank(configResource.getResourceId())) {
\r 
 274             throw new SvcLogicException("config resource  resource id is missing.");
\r 
 277         if (StringUtils.isBlank(configResource.getRecipeName())) {
\r 
 278             throw new SvcLogicException("config resource action name is missing.");
\r 
 281         if (StringUtils.isBlank(configResource.getTemplateName())) {
\r 
 282             throw new SvcLogicException("config resource template name is missing.");
\r 
 285         if (configResource.getResourceAssignments() != null) {
\r 
 286             List<ResourceAssignmentData> resourceAssignments = configResource.getResourceAssignments();
\r 
 287             for (ResourceAssignmentData resourceAssignmentData : resourceAssignments) {
\r 
 288                 if (resourceAssignmentData != null) {
\r 
 289                     resourceAssignmentData.setConfigResourceId(configResource.getConfigResourceId());
\r 
 290                     if (StringUtils.isBlank(resourceAssignmentData.getId())) {
\r 
 291                         resourceAssignmentData.setId(resourceAssignmentData.getUniqueId());
\r 
 293                     if (resourceAssignmentData.getVersion() == null || resourceAssignmentData.getVersion() == 0) {
\r 
 294                         resourceAssignmentData.setVersion(1);
\r 
 296                     if (StringUtils.isBlank(resourceAssignmentData.getUpdatedBy())) {
\r 
 297                         resourceAssignmentData.setUpdatedBy("System");
\r 
 299                     if (resourceAssignmentData.getStatus() == null) {
\r 
 300                         logger.warn("{} status is missing and setting to undefined", resourceAssignmentData);
\r 
 301                         resourceAssignmentData.setStatus("undefined");
\r 
 303                     if (resourceAssignmentData.getMessage() == null) {
\r 
 304                         resourceAssignmentData.setMessage("");
\r 
 306                     if (resourceAssignmentData.getResourceValue() == null) {
\r 
 307                         resourceAssignmentData.setResourceValue("");
\r 
 310                     validateResourceAssignmentData(resourceAssignmentData);
\r 
 318     private boolean validateResourceAssignmentData(ResourceAssignmentData resourceAssignmentData)
\r 
 319             throws SvcLogicException {
\r 
 320         if (resourceAssignmentData == null) {
\r 
 321             throw new SvcLogicException("resource assignment data information is missing.");
\r 
 323         if (StringUtils.isBlank(resourceAssignmentData.getConfigResourceId())) {
\r 
 324             throw new SvcLogicException("resource assignment data config resource id is missing.");
\r 
 326         if (resourceAssignmentData.getVersion() == null) {
\r 
 327             throw new SvcLogicException(
\r 
 328                     String.format("resource assignment data (%s) version is missing", resourceAssignmentData));
\r 
 330         if (StringUtils.isBlank(resourceAssignmentData.getTemplateKeyName())) {
\r 
 331             throw new SvcLogicException(String.format("resource assignment data (%s) template key name is missing",
\r 
 332                     resourceAssignmentData));
\r 
 334         if (StringUtils.isBlank(resourceAssignmentData.getResourceName())) {
\r 
 335             throw new SvcLogicException(
\r 
 336                     String.format("resource assignment data (%s) resource name is missing", resourceAssignmentData));
\r 
 338         if (resourceAssignmentData.getResourceValue() == null) {
\r 
 339             throw new SvcLogicException(
\r 
 340                     String.format("resource assignment data (%s) resource value is missing", resourceAssignmentData));
\r 
 342         if (StringUtils.isBlank(resourceAssignmentData.getSource())) {
\r 
 343             throw new SvcLogicException(
\r 
 344                     String.format("resource assignment data (%s) source is missing", resourceAssignmentData));
\r 
 346         if (StringUtils.isBlank(resourceAssignmentData.getDataType())) {
\r 
 347             throw new SvcLogicException(
\r 
 348                     String.format("resource assignment data (%s) data type is missing", resourceAssignmentData));
\r 
 350         if (StringUtils.isBlank(resourceAssignmentData.getStatus())) {
\r 
 351             throw new SvcLogicException(
\r 
 352                     String.format("resource assignment data (%s) status is missing", resourceAssignmentData));
\r 
 354         if (resourceAssignmentData.getMessage() == null) {
\r 
 355             throw new SvcLogicException(
\r 
 356                     String.format("resource assignment data (%s) message is missing", resourceAssignmentData));
\r 
 361     private <T> T queryOneForObject(String sql, Object[] args, RowMapper<T> rowMapper) {
\r 
 362         List<T> results = this.jdbcTemplate.query(sql, args, new RowMapperResultSetExtractor<T>(rowMapper, 1));
\r 
 363         if (results != null && !results.isEmpty()) {
\r 
 364             return results.get(0);
\r 
 370     class ConfigResourceMapper implements RowMapper<ConfigResource> {
\r 
 372         public ConfigResource mapRow(ResultSet rs, int rowNum) throws SQLException {
\r 
 373             ConfigResource configResource = new ConfigResource();
\r 
 374             configResource.setConfigResourceId(rs.getString("config_resource_id"));
\r 
 375             configResource.setResourceId(rs.getString("resource_id"));
\r 
 376             configResource.setResourceType(rs.getString("resource_type"));
\r 
 377             configResource.setServiceTemplateName(rs.getString("service_template_name"));
\r 
 378             configResource.setServiceTemplateVersion(rs.getString("service_template_version"));
\r 
 379             configResource.setTemplateName(rs.getString("template_name"));
\r 
 380             configResource.setRecipeName(rs.getString("recipe_name"));
\r 
 381             configResource.setRequestId(rs.getString("request_id"));
\r 
 382             configResource.setResourceData(rs.getString("resource_data"));
\r 
 383             configResource.setMaskData(rs.getString("mask_data"));
\r 
 384             configResource.setStatus(rs.getString("status"));
\r 
 385             configResource.setCreatedDate(rs.getDate("created_date"));
\r 
 386             configResource.setUpdatedBy(rs.getString("updated_by"));
\r 
 387             return configResource;
\r 
 391     class ResourceAssignmentDataMapper implements RowMapper<ResourceAssignmentData> {
\r 
 393         public ResourceAssignmentData mapRow(ResultSet rs, int rowNum) throws SQLException {
\r 
 394             ResourceAssignmentData resourceAssignmentData = new ResourceAssignmentData();
\r 
 395             resourceAssignmentData.setConfigResourceId(rs.getString("config_resource_id"));
\r 
 396             resourceAssignmentData.setDataType(rs.getString("data_type"));
\r 
 397             resourceAssignmentData.setEntrySchema(rs.getString("entry_schema"));
\r 
 398             resourceAssignmentData.setId(rs.getString("config_resource_assignment_data_id"));
\r 
 399             resourceAssignmentData.setMessage(rs.getString("message"));
\r 
 400             resourceAssignmentData.setResourceName(rs.getString("resource_name"));
\r 
 401             resourceAssignmentData.setResourceValue(rs.getString("resource_value"));
\r 
 402             resourceAssignmentData.setSource(rs.getString("source"));
\r 
 403             resourceAssignmentData.setStatus(rs.getString("status"));
\r 
 404             resourceAssignmentData.setTemplateKeyName(rs.getString("template_key_name"));
\r 
 405             resourceAssignmentData.setUpdatedBy(rs.getString("updated_by"));
\r 
 406             resourceAssignmentData.setUpdatedDate(rs.getTimestamp("updated_date"));
\r 
 407             resourceAssignmentData.setVersion(rs.getInt("version"));
\r 
 408             return resourceAssignmentData;
\r