2  * ============LICENSE_START=======================================================
 
   3  * ONAP : ccsdk features
 
   4  * ================================================================================
 
   5  * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property.
 
   7  * ================================================================================
 
   8  * Licensed under the Apache License, Version 2.0 (the "License");
 
   9  * you may not use this file except in compliance with the License.
 
  10  * You may obtain a copy of the License at
 
  12  *     http://www.apache.org/licenses/LICENSE-2.0
 
  14  * Unless required by applicable law or agreed to in writing, software
 
  15  * distributed under the License is distributed on an "AS IS" BASIS,
 
  16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  17  * See the License for the specific language governing permissions and
 
  18  * limitations under the License.
 
  19  * ============LICENSE_END=========================================================
 
  22 package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query;
 
  24 import com.fasterxml.jackson.core.JsonProcessingException;
 
  25 import java.lang.reflect.InvocationTargetException;
 
  26 import java.lang.reflect.Method;
 
  27 import java.util.ArrayList;
 
  28 import java.util.List;
 
  29 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBMapper;
 
  30 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.filters.DBKeyValuePair;
 
  31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
 
  32 import org.opendaylight.yangtools.yang.binding.DataObject;
 
  33 import org.slf4j.Logger;
 
  34 import org.slf4j.LoggerFactory;
 
  36 public class InsertQuery<T extends DataObject> implements SqlQuery {
 
  38     private final Logger LOG = LoggerFactory.getLogger(InsertQuery.class);
 
  40     protected final Entity entity;
 
  41     private final String controllerId;
 
  42     private final boolean ignoreControllerId;
 
  43     private final T object;
 
  44     private final boolean ignoreNull;
 
  46     private final boolean ignoreIdField;
 
  48     public InsertQuery(Entity e, T object, String controllerId) {
 
  49         this(e, object, controllerId, SqlQuery.DEFAULT_IGNORE_CONTROLLERID);
 
  52     public InsertQuery(Entity e, T object, String controllerId, boolean ignoreControllerId) {
 
  53         this(e, object, controllerId, ignoreControllerId, SqlQuery.DEFAULT_IGNORE_ID_FIELD);
 
  56     public InsertQuery(Entity e, T object, String controllerId, boolean ignoreControllerId, boolean ignoreIdField) {
 
  58         this.controllerId = controllerId;
 
  60         this.ignoreNull = true;
 
  62         this.ignoreControllerId = ignoreControllerId;
 
  63         this.ignoreIdField = ignoreIdField;
 
  67     public String toSql() {
 
  69             return this.toSqlWithError();
 
  70         } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
 
  71                 | JsonProcessingException e) {
 
  72             LOG.warn("unable to create insert statement for table {} from object {}: ", this.entity, this.object, e);
 
  77     protected String toSqlWithError() throws IllegalAccessException, IllegalArgumentException,
 
  78             InvocationTargetException, JsonProcessingException {
 
  79         Class<?> cls = this.object.getClass();
 
  80         List<DBKeyValuePair<String>> kvps = new ArrayList<>();
 
  81         List<String> cols = new ArrayList<>();
 
  82         List<String> args = new ArrayList<>();
 
  85         StringBuilder sb = new StringBuilder();
 
  86         sb.append("INSERT INTO `" + entity.getName() + "` (");
 
  87         for (Method m : SqlDBMapper.getFilteredMethods(cls, true)) {
 
  89             m.setAccessible(true);
 
  90             value = m.invoke(this.object);
 
  91             col = SqlDBMapper.getColumnName(m);
 
  92             if (col.equals("id")) {
 
  93                 if (this.ignoreIdField) {
 
  96                 if (this.id != null) {
 
 100             if (ignoreNull && value == null) {
 
 103             DBKeyValuePair<String> kvp = SqlDBMapper.getEscapedKeyValue(m, col, value);
 
 104             cols.add(kvp.getKey());
 
 105             args.add(kvp.getValue());
 
 108         if (this.id != null && !cols.contains("`id`")) {
 
 110             args.add("'" + this.id + "'");
 
 112         if (!this.ignoreControllerId) {
 
 113             args.add("'" + this.controllerId + "'");
 
 115         sb.append(String.join(",", cols));
 
 116         if (!this.ignoreControllerId) {
 
 117             sb.append(",`" + SqlDBMapper.ODLID_DBCOL + "`) VALUES (");
 
 119             sb.append(") VALUES (");
 
 121         sb.append(String.join(",", args) + " )");
 
 122         this.appendAdditionalToQuery(sb, kvps);
 
 123         return sb.toString();
 
 126     protected void appendAdditionalToQuery(StringBuilder sb, List<DBKeyValuePair<String>> keyValues) {
 
 130     public void setId(String id) {