2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 ONAP
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.ccsdk.sli.core.sli;
24 import java.io.FileInputStream;
25 import java.sql.SQLException;
26 import java.text.SimpleDateFormat;
27 import java.util.ArrayList;
28 import java.util.Date;
29 import java.util.Properties;
31 import javax.sql.rowset.CachedRowSet;
33 import org.onap.ccsdk.sli.core.dblib.DbLibService;
34 import org.osgi.framework.BundleContext;
35 import org.osgi.framework.FrameworkUtil;
36 import org.osgi.framework.ServiceReference;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
41 public class MessageWriter {
43 private static final Logger LOG = LoggerFactory.getLogger(MessageWriter.class);
45 private static final String DBLIB_SERVICE = "org.onap.ccsdk.sli.core.dblib.DBResourceManager";
46 private static final String SVCLOGIC_PROP_VAR = "SDNC_SLI_PROPERTIES";
47 private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR";
49 private static final String INCOMING_PROPERTY_NAME = "org.onap.ccsdk.sli.MessageWriter.writeIncomingRequests";
50 private static final String OUTGOING_PROPERTY_NAME = "org.onap.ccsdk.sli.MessageWriter.writeOutgoingRequests";
52 private static final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
54 private static DbLibService dbLibService = null;
56 private static boolean incomingEnabled = false;
57 private static boolean outgoingEnabled = false;
59 private static boolean initialized = false;
61 @SuppressWarnings({ "rawtypes", "unchecked" })
62 private static void init() {
69 Properties props = new Properties();
70 String propPath = System.getenv(SVCLOGIC_PROP_VAR);
72 if (propPath == null) {
73 String propDir = System.getenv(SDNC_CONFIG_DIR);
74 if (propDir == null) {
75 propDir = "/opt/sdnc/data/properties";
77 propPath = propDir + "/svclogic.properties";
78 LOG.warn("Environment variable " + SVCLOGIC_PROP_VAR + " unset - defaulting to " + propPath);
81 File propFile = new File(propPath);
83 if (!propFile.exists()) {
84 LOG.warn("Property file does not exist: " + propPath);
88 props.load(new FileInputStream(propFile));
89 } catch (Exception e) {
90 LOG.warn("Error loading property file: " + propPath, e);
93 incomingEnabled = Boolean.valueOf(props.getProperty(INCOMING_PROPERTY_NAME, "false"));
94 outgoingEnabled = Boolean.valueOf(props.getProperty(OUTGOING_PROPERTY_NAME, "false"));
96 LOG.info(INCOMING_PROPERTY_NAME + ": " + incomingEnabled);
97 LOG.info(OUTGOING_PROPERTY_NAME + ": " + outgoingEnabled);
99 if (dbLibService != null)
102 BundleContext bctx = FrameworkUtil.getBundle(MessageWriter.class).getBundleContext();
104 ServiceReference sref = bctx.getServiceReference(DBLIB_SERVICE);
107 LOG.warn("Could not find service reference for DBLIB service (" + DBLIB_SERVICE + ")");
109 dbLibService = (DbLibService) bctx.getService(sref);
110 if (dbLibService == null) {
111 LOG.warn("Could not find service reference for DBLIB service (" + DBLIB_SERVICE + ")");
116 public static void saveOutgoingRequest(
118 String serviceInstanceId,
124 if (!outgoingEnabled)
127 if (serviceInstanceId == null || serviceInstanceId.trim().length() == 0)
128 serviceInstanceId = "NA";
130 int seqnum = getLastSequenceNumber("OUTGOING_MESSAGE", requestId) + 1;
131 String now = df.format(new Date());
133 String sql = "INSERT INTO OUTGOING_MESSAGE (\n" +
134 " request_id, sequence_number, service_instance_id, target_url, request, start_time)\n" +
135 "VALUES (?, ?, ?, ?, ?, ?)";
137 ArrayList<String> data = new ArrayList<>();
139 data.add(String.valueOf(seqnum));
140 data.add(serviceInstanceId);
145 dbLibService.writeData(sql, data, null);
147 } catch (Exception e) {
148 LOG.warn("Failed to save outgoing request for request-id: " + requestId, e);
152 public static void saveOutgoingResponse(String requestId, int httpResponseCode, String response) {
156 if (!outgoingEnabled)
159 int seqnum = getLastSequenceNumber("OUTGOING_MESSAGE", requestId);
161 LOG.warn("Failed to save outgoing response for request-id: " + requestId +
162 ": Request record not found in OUTGOING_MESSAGE");
166 String now = df.format(new Date());
168 String sql = "UPDATE OUTGOING_MESSAGE SET http_response_code = ?, response = ?,\n" +
169 " duration = timestampdiff(MICROSECOND, start_time, ?) / 1000\n" +
170 "WHERE request_id = ? AND sequence_number = ?";
172 ArrayList<String> data = new ArrayList<>();
173 data.add(String.valueOf(httpResponseCode));
177 data.add(String.valueOf(seqnum));
179 dbLibService.writeData(sql, data, null);
181 } catch (Exception e) {
182 LOG.warn("Failed to save outgoing response for request-id: " + requestId, e);
186 public static void saveIncomingRequest(
188 String serviceInstanceId,
194 if (!incomingEnabled)
197 if (serviceInstanceId == null || serviceInstanceId.trim().length() == 0)
198 serviceInstanceId = "NA";
200 int seqnum = getLastSequenceNumber("INCOMING_MESSAGE", requestId) + 1;
201 String now = df.format(new Date());
203 String sql = "INSERT INTO INCOMING_MESSAGE (\n" +
204 " request_id, sequence_number, service_instance_id, request_host, request, start_time)\n" +
205 "VALUES (?, ?, ?, ?, ?, ?)";
207 ArrayList<String> data = new ArrayList<>();
209 data.add(String.valueOf(seqnum));
210 data.add(serviceInstanceId);
211 data.add(requestHost);
215 dbLibService.writeData(sql, data, null);
217 } catch (Exception e) {
218 LOG.warn("Failed to save incoming request for request-id: " + requestId, e);
222 public static void saveIncomingResponse(String requestId, int httpResponseCode, String response) {
226 if (!incomingEnabled)
229 int seqnum = getLastSequenceNumber("INCOMING_MESSAGE", requestId);
231 LOG.warn("Failed to save response for request-id: " + requestId +
232 ": Request record not found in INCOMING_MESSAGE");
236 String now = df.format(new Date());
238 String sql = "UPDATE INCOMING_MESSAGE SET http_response_code = ?, response = ?,\n" +
239 " duration = timestampdiff(MICROSECOND, start_time, ?) / 1000\n" +
240 "WHERE request_id = ? AND sequence_number = ?";
242 ArrayList<String> data = new ArrayList<>();
243 data.add(String.valueOf(httpResponseCode));
247 data.add(String.valueOf(seqnum));
249 dbLibService.writeData(sql, data, null);
251 } catch (Exception e) {
252 LOG.warn("Failed to save response for request-id: " + requestId, e);
256 public static String getServiceInstanceId(String requestId) throws SQLException {
259 String sql = "SELECT service_instance_id FROM OUTGOING_MESSAGE WHERE request_id = '" + requestId +
260 "' ORDER BY sequence_number DESC";
262 CachedRowSet rs = null;
264 rs = dbLibService.getData(sql, null, null);
266 return rs.getString("service_instance_id");
272 } catch (Exception e) {
273 LOG.warn("Failed to close CachedRowSet", e);
280 private static int getLastSequenceNumber(String tableName, String requestId) throws SQLException {
281 String sql = "SELECT sequence_number FROM " + tableName + " WHERE request_id = '" + requestId +
282 "' ORDER BY sequence_number DESC";
284 CachedRowSet rs = null;
286 rs = dbLibService.getData(sql, null, null);
288 return rs.getInt("sequence_number");
294 } catch (Exception e) {
295 LOG.warn("Failed to close CachedRowSet", e);