1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.bitrepository.alarm.store;
23
24 import java.util.ArrayList;
25 import java.util.List;
26
27 import org.bitrepository.bitrepositoryelements.Alarm;
28 import org.bitrepository.common.ArgumentValidator;
29 import org.bitrepository.common.utils.CalendarUtils;
30 import org.bitrepository.service.database.DBConnector;
31 import org.bitrepository.service.database.DatabaseUtils;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 import static org.bitrepository.alarm.store.AlarmDatabaseConstants.ALARM_CODE;
36 import static org.bitrepository.alarm.store.AlarmDatabaseConstants.ALARM_COLLECTION_ID;
37 import static org.bitrepository.alarm.store.AlarmDatabaseConstants.ALARM_COMPONENT_GUID;
38 import static org.bitrepository.alarm.store.AlarmDatabaseConstants.ALARM_DATE;
39 import static org.bitrepository.alarm.store.AlarmDatabaseConstants.ALARM_FILE_ID;
40 import static org.bitrepository.alarm.store.AlarmDatabaseConstants.ALARM_TABLE;
41 import static org.bitrepository.alarm.store.AlarmDatabaseConstants.ALARM_TEXT;
42 import static org.bitrepository.alarm.store.AlarmDatabaseConstants.COMPONENT_GUID;
43 import static org.bitrepository.alarm.store.AlarmDatabaseConstants.COMPONENT_ID;
44 import static org.bitrepository.alarm.store.AlarmDatabaseConstants.COMPONENT_TABLE;
45
46
47
48
49
50
51
52
53
54
55
56
57 public class AlarmDatabaseIngestor {
58
59 private Logger log = LoggerFactory.getLogger(getClass());
60
61 private final DBConnector dbConnector;
62
63
64
65
66 public AlarmDatabaseIngestor(DBConnector dbConnector) {
67 ArgumentValidator.checkNotNull(dbConnector, "DBConnector dbConnector");
68
69 this.dbConnector = dbConnector;
70 }
71
72
73
74
75
76 public void ingestAlarm(Alarm alarm) {
77 ArgumentValidator.checkNotNull(alarm, "Alarm alarm");
78
79 String sqlInsert = "INSERT INTO " + ALARM_TABLE + " ( " + createIngestElementString(alarm) + " )"
80 + " VALUES ( " + createIngestArgumentString(alarm) + " )";
81 DatabaseUtils.executeStatement(dbConnector, sqlInsert, extractArgumentsFromEvent(alarm));
82 }
83
84
85
86
87
88 private String createIngestElementString(Alarm alarm) {
89 StringBuilder res = new StringBuilder();
90
91 addElement(res, alarm.getAlarmRaiser(), ALARM_COMPONENT_GUID);
92 addElement(res, alarm.getAlarmCode(), ALARM_CODE);
93 addElement(res, alarm.getAlarmText(), ALARM_TEXT);
94 addElement(res, alarm.getOrigDateTime(), ALARM_DATE);
95 addElement(res, alarm.getFileID(), ALARM_FILE_ID);
96 addElement(res, alarm.getCollectionID(), ALARM_COLLECTION_ID);
97
98 return res.toString();
99 }
100
101
102
103
104
105
106
107 private void addElement(StringBuilder res, Object element, String name) {
108 if(element == null) {
109 return;
110 }
111
112 if(res.length() == 0) {
113 res.append(" ");
114 } else {
115 res.append(" , ");
116 }
117
118 res.append(name);
119 }
120
121
122
123
124
125 private String createIngestArgumentString(Alarm alarm) {
126 StringBuilder res = new StringBuilder();
127
128 addArgument(res, alarm.getAlarmRaiser());
129 addArgument(res, alarm.getAlarmCode());
130 addArgument(res, alarm.getAlarmText());
131 addArgument(res, alarm.getOrigDateTime());
132 addArgument(res, alarm.getFileID());
133 addArgument(res, alarm.getCollectionID());
134
135 return res.toString();
136 }
137
138
139
140
141
142
143 private void addArgument(StringBuilder res, Object element) {
144 if(element == null) {
145 return;
146 }
147
148 if(res.length() == 0) {
149 res.append(" ? ");
150 } else {
151 res.append(", ? ");
152 }
153 }
154
155
156
157
158
159 private Object[] extractArgumentsFromEvent(Alarm alarm) {
160 List<Object> res = new ArrayList<Object>();
161
162 if(alarm.getAlarmRaiser() != null) {
163 Long componentGuid = retrieveComponentGuid(alarm.getAlarmRaiser());
164 res.add(componentGuid);
165 }
166
167 if(alarm.getAlarmCode() != null) {
168 res.add(alarm.getAlarmCode().toString());
169 }
170
171 if(alarm.getAlarmText() != null) {
172 res.add(alarm.getAlarmText());
173 }
174
175 if(alarm.getOrigDateTime() != null) {
176 res.add(CalendarUtils.convertFromXMLGregorianCalendar(alarm.getOrigDateTime()));
177 }
178
179 if(alarm.getFileID() != null) {
180 res.add(alarm.getFileID());
181 }
182
183 if(alarm.getCollectionID() != null) {
184 res.add(alarm.getCollectionID());
185 }
186
187 return res.toArray();
188 }
189
190
191
192
193
194
195
196
197 private synchronized long retrieveComponentGuid(String componentId) {
198 String sqlRetrieve = "SELECT " + COMPONENT_GUID + " FROM " + COMPONENT_TABLE
199 + " WHERE " + COMPONENT_ID + " = ?";
200
201 Long guid = DatabaseUtils.selectLongValue(dbConnector, sqlRetrieve, componentId);
202
203 if(guid == null) {
204 log.debug("Inserting component '" + componentId + "' into the component table.");
205 String sqlInsert = "INSERT INTO " + COMPONENT_TABLE + " ( " + COMPONENT_ID + " ) VALUES ( ? )";
206 DatabaseUtils.executeStatement(dbConnector, sqlInsert, componentId);
207
208 guid = DatabaseUtils.selectLongValue(dbConnector, sqlRetrieve, componentId);
209 }
210
211 return guid;
212 }
213 }