aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/org/onap/dcae/common/EventUpdater.java
blob: 1caa4f18a5c70fa95a4cfd8f7978a64f1a8ba4aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 * ============LICENSE_START=======================================================
 * PROJECT
 * ================================================================================
 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 * Copyright (C) 2019 Nokia. All rights reserved.s
 * ================================================================================
 * 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.
 * ============LICENSE_END=========================================================
 */

package org.onap.dcae.common;

import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import org.json.JSONArray;
import org.json.JSONObject;
import org.onap.dcae.ApplicationException;
import org.onap.dcae.ApplicationSettings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class EventUpdater {

  private static final String EVENT_LIST = "eventList";
  private static final String EVENT = "event";
  private static final String VES_UNIQUE_ID = "VESuniqueId";
  private static final String VES_VERSION = "VESversion";
  private static final String COULD_NOT_FIND_FILE = "Couldn't find file ./etc/eventTransform.json";
  private static final Type EVENT_LIST_TYPE = new TypeToken<List<Event>>() {}.getType();
  private static final Logger log = LoggerFactory.getLogger(EventSender.class);
  private static final String EVENT_LITERAL = "event";
  private static final String COMMON_EVENT_HEADER = "commonEventHeader";
  private static final String EVENT_TRANSFORM = "./etc/eventTransform.json";
  private ApplicationSettings settings;
  private final SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, MM dd yyyy hh:mm:ss z");

  public EventUpdater(ApplicationSettings settings) {
    this.settings = settings;
  }

  public JSONArray convert(JSONObject jsonObject, String version, UUID uuid, String type){
    if(type.equalsIgnoreCase(EVENT_LIST)){
      return convertEvents(jsonObject, uuid.toString(), version);
    }
    else {
      return convertEvent(jsonObject, uuid.toString(), version);
    }
  }

  private JSONArray convertEvents(JSONObject jsonObject,
      String uuid, String version) {
    JSONArray asArrayEvents = new JSONArray();

    JSONArray events = jsonObject.getJSONArray(EVENT_LIST);
    for (int i = 0; i < events.length(); i++) {
      JSONObject event = new JSONObject().put(EVENT, events.getJSONObject(i));
      event.put(VES_UNIQUE_ID, uuid + "-" + i);
      event.put(VES_VERSION, version);
      asArrayEvents.put(overrideEvent(event));
    }
    return asArrayEvents;
  }

  private JSONArray convertEvent(JSONObject jsonObject, String uuid, String version) {
    jsonObject.put(VES_UNIQUE_ID, uuid);
    jsonObject.put(VES_VERSION, version);
    return new JSONArray().put(overrideEvent(jsonObject));
  }

  private JSONObject overrideEvent(JSONObject event) {
    JSONObject jsonObject = addCurrentTimeToEvent(event);
    if (settings.eventTransformingEnabled()) {
      try (FileReader fr = new FileReader(EVENT_TRANSFORM)) {
        log.info("parse " + EVENT_TRANSFORM + " file");
        List<Event> events = new Gson().fromJson(fr, EVENT_LIST_TYPE);
        parseEventsJson(events, new ConfigProcessorAdapter(new ConfigProcessors(jsonObject)));
      } catch (IOException e) {
        log.error(COULD_NOT_FIND_FILE, e);
        throw new ApplicationException(COULD_NOT_FIND_FILE, e);
      }
    }
    if (jsonObject.has(VES_VERSION))
       jsonObject.remove(VES_VERSION);
    log.debug("Modified event:" + jsonObject);
    return jsonObject;
  }

  private JSONObject addCurrentTimeToEvent(JSONObject event) {
    final Date currentTime = new Date();
    JSONObject collectorTimeStamp = new JSONObject().put("collectorTimeStamp", dateFormat.format(currentTime));
    JSONObject commonEventHeaderkey = event.getJSONObject(EVENT_LITERAL).getJSONObject(COMMON_EVENT_HEADER);
    commonEventHeaderkey.put("internalHeaderFields", collectorTimeStamp);
    event.getJSONObject(EVENT_LITERAL).put(COMMON_EVENT_HEADER, commonEventHeaderkey);
    return event;
  }

  private void parseEventsJson(List<Event> eventsTransform, ConfigProcessorAdapter configProcessorAdapter) {
    for (Event eventTransform : eventsTransform) {
      JSONObject filterObj = new JSONObject(eventTransform.filter.toString());
      if (configProcessorAdapter.isFilterMet(filterObj)) {
        callProcessorsMethod(configProcessorAdapter, eventTransform.processors);
      }
    }
  }

  private void callProcessorsMethod(ConfigProcessorAdapter configProcessorAdapter, List<Processor> processors) {
    for (Processor processor : processors) {
      //TODO try to remove refection
      final String functionName = processor.functionName;
      final JSONObject args = new JSONObject(processor.args.toString());
      log.info(String.format("functionName==%s | args==%s", functionName, args));
      try {
        configProcessorAdapter.runConfigProcessorFunctionByName(functionName, args);
      } catch (ReflectiveOperationException e) {
        log.error("EventProcessor Exception" + e.getMessage() + e + e.getCause());
      }
    }
  }
}