1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.waarp.openr66.dao.database;
22
23 import org.w3c.dom.Document;
24 import org.w3c.dom.Element;
25 import org.w3c.dom.Node;
26 import org.w3c.dom.NodeList;
27 import org.waarp.common.database.exception.WaarpDatabaseSqlException;
28 import org.waarp.common.lru.SynchronizedLruCache;
29 import org.waarp.common.utility.ParametersChecker;
30 import org.waarp.common.utility.WaarpStringUtils;
31 import org.waarp.openr66.dao.RuleDAO;
32 import org.waarp.openr66.dao.exception.DAOConnectionException;
33 import org.waarp.openr66.pojo.Rule;
34 import org.waarp.openr66.pojo.RuleTask;
35 import org.waarp.openr66.pojo.UpdatedInfo;
36 import org.waarp.openr66.protocol.configuration.Configuration;
37
38 import javax.xml.parsers.DocumentBuilderFactory;
39 import java.io.ByteArrayInputStream;
40 import java.io.InputStream;
41 import java.sql.Connection;
42 import java.sql.ResultSet;
43 import java.sql.SQLException;
44 import java.util.ArrayList;
45 import java.util.List;
46
47 import static org.waarp.openr66.dao.DAOFactory.*;
48
49
50
51
52 public class DBRuleDAO extends StatementExecutor<Rule> implements RuleDAO {
53 public static final String ID_FIELD = "idrule";
54 public static final String HOSTIDS_FIELD = "hostids";
55 public static final String MODE_TRANS_FIELD = "modetrans";
56 public static final String RECV_PATH_FIELD = "recvpath";
57 public static final String SEND_PATH_FIELD = "sendpath";
58 public static final String ARCHIVE_PATH_FIELD = "archivepath";
59 public static final String WORK_PATH_FIELD = "workpath";
60 public static final String R_PRE_TASKS_FIELD = "rpretasks";
61 public static final String R_POST_TASKS_FIELD = "rposttasks";
62 public static final String R_ERROR_TASKS_FIELD = "rerrortasks";
63 public static final String S_PRE_TASKS_FIELD = "spretasks";
64 public static final String S_POST_TASKS_FIELD = "sposttasks";
65 public static final String S_ERROR_TASKS_FIELD = "serrortasks";
66 public static final String UPDATED_INFO_FIELD = "updatedinfo";
67
68 public static final String TABLE = "rules";
69 public static final String TASK_NODE = "task";
70 public static final String TYPE_FIELD = "type";
71 public static final String PATH_FIELD = "path";
72 public static final String DELAY_FIELD = "delay";
73
74 protected static final String SQL_DELETE_ALL = "DELETE FROM " + TABLE;
75 protected static final String SQL_DELETE =
76 "DELETE FROM " + TABLE + WHERE + ID_FIELD + PARAMETER;
77 protected static final String SQL_GET_ALL = "SELECT * FROM " + TABLE;
78 protected static final String SQL_COUNT_ALL = SQL_COUNT_ALL_PREFIX + TABLE;
79 protected static final String SQL_EXIST =
80 "SELECT 1 FROM " + TABLE + WHERE + ID_FIELD + PARAMETER;
81 protected static final String SQL_SELECT =
82 "SELECT * FROM " + TABLE + WHERE + ID_FIELD + PARAMETER;
83 protected static final String SQL_INSERT =
84 "INSERT INTO " + TABLE + " (" + ID_FIELD + ", " + HOSTIDS_FIELD + ", " +
85 MODE_TRANS_FIELD + ", " + RECV_PATH_FIELD + ", " + SEND_PATH_FIELD +
86 ", " + ARCHIVE_PATH_FIELD + ", " + WORK_PATH_FIELD + ", " +
87 R_PRE_TASKS_FIELD + ", " + R_POST_TASKS_FIELD + ", " +
88 R_ERROR_TASKS_FIELD + ", " + S_PRE_TASKS_FIELD + ", " +
89 S_POST_TASKS_FIELD + ", " + S_ERROR_TASKS_FIELD + ", " +
90 UPDATED_INFO_FIELD + ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
91
92 protected static final String SQL_UPDATE =
93 "UPDATE " + TABLE + " SET " + ID_FIELD + PARAMETER_COMMA + HOSTIDS_FIELD +
94 PARAMETER_COMMA + MODE_TRANS_FIELD + PARAMETER_COMMA + RECV_PATH_FIELD +
95 PARAMETER_COMMA + SEND_PATH_FIELD + PARAMETER_COMMA + ARCHIVE_PATH_FIELD +
96 PARAMETER_COMMA + WORK_PATH_FIELD + PARAMETER_COMMA + R_PRE_TASKS_FIELD +
97 PARAMETER_COMMA + R_POST_TASKS_FIELD + PARAMETER_COMMA +
98 R_ERROR_TASKS_FIELD + PARAMETER_COMMA + S_PRE_TASKS_FIELD +
99 PARAMETER_COMMA + S_POST_TASKS_FIELD + PARAMETER_COMMA +
100 S_ERROR_TASKS_FIELD + PARAMETER_COMMA + UPDATED_INFO_FIELD +
101 " = ? WHERE " + ID_FIELD + PARAMETER;
102
103
104
105
106 private static final SynchronizedLruCache<String, Rule>
107 reentrantConcurrentHashMap =
108 new SynchronizedLruCache<String, Rule>(500, 180000);
109 protected static final String HOSTID = "hostid";
110
111 public DBRuleDAO(final Connection con) {
112 super(con);
113 }
114
115 @Override
116 protected final boolean isCachedEnable() {
117 return Configuration.configuration.getMultipleMonitors() <= 1;
118 }
119
120 @Override
121 protected final SynchronizedLruCache<String, Rule> getCache() {
122 return reentrantConcurrentHashMap;
123 }
124
125 @Override
126 protected final String getId(final Rule e1) {
127 return e1.getName();
128 }
129
130 @Override
131 protected final String getTable() {
132 return TABLE;
133 }
134
135 @Override
136 protected final String getSelectRequest() {
137 return SQL_SELECT;
138 }
139
140 @Override
141 protected final String getGetAllRequest() {
142 return SQL_GET_ALL;
143 }
144
145 @Override
146 protected final String getCountRequest() {
147 return SQL_COUNT_ALL;
148 }
149
150 @Override
151 protected final String getExistRequest() {
152 return SQL_EXIST;
153 }
154
155 @Override
156 protected final Object[] getInsertValues(final Rule rule) {
157 return new Object[] {
158 rule.getName(), rule.getXMLHostids(), rule.getMode(),
159 rule.getRecvPath(), rule.getSendPath(), rule.getArchivePath(),
160 rule.getWorkPath(), rule.getXMLRPreTasks(), rule.getXMLRPostTasks(),
161 rule.getXMLRErrorTasks(), rule.getXMLSPreTasks(),
162 rule.getXMLSPostTasks(), rule.getXMLSErrorTasks(),
163 rule.getUpdatedInfo().ordinal()
164 };
165 }
166
167 @Override
168 protected final String getInsertRequest() {
169 return SQL_INSERT;
170 }
171
172 @Override
173 protected final Object[] getUpdateValues(final Rule rule) {
174 return new Object[] {
175 rule.getName(), rule.getXMLHostids(), rule.getMode(),
176 rule.getRecvPath(), rule.getSendPath(), rule.getArchivePath(),
177 rule.getWorkPath(), rule.getXMLRPreTasks(), rule.getXMLRPostTasks(),
178 rule.getXMLRErrorTasks(), rule.getXMLSPreTasks(),
179 rule.getXMLSPostTasks(), rule.getXMLSErrorTasks(),
180 rule.getUpdatedInfo().ordinal(), rule.getName()
181 };
182 }
183
184 @Override
185 protected final String getUpdateRequest() {
186 return SQL_UPDATE;
187 }
188
189 @Override
190 protected final String getDeleteRequest() {
191 return SQL_DELETE;
192 }
193
194 @Override
195 protected final String getDeleteAllRequest() {
196 return SQL_DELETE_ALL;
197 }
198
199 @Override
200 public final Rule getFromResultSet(final ResultSet set)
201 throws SQLException, DAOConnectionException {
202 try {
203 return new Rule(set.getString(ID_FIELD), set.getInt(MODE_TRANS_FIELD),
204 retrieveHostids(set.getString(HOSTIDS_FIELD)),
205 set.getString(RECV_PATH_FIELD),
206 set.getString(SEND_PATH_FIELD),
207 set.getString(ARCHIVE_PATH_FIELD),
208 set.getString(WORK_PATH_FIELD),
209 retrieveTasks(set.getString(R_PRE_TASKS_FIELD)),
210 retrieveTasks(set.getString(R_POST_TASKS_FIELD)),
211 retrieveTasks(set.getString(R_ERROR_TASKS_FIELD)),
212 retrieveTasks(set.getString(S_PRE_TASKS_FIELD)),
213 retrieveTasks(set.getString(S_POST_TASKS_FIELD)),
214 retrieveTasks(set.getString(S_ERROR_TASKS_FIELD)),
215 UpdatedInfo.valueOf(set.getInt(UPDATED_INFO_FIELD)));
216 } catch (final WaarpDatabaseSqlException e) {
217 throw new SQLException(e);
218 }
219 }
220
221 private List<String> retrieveHostids(final String xml)
222 throws DAOConnectionException {
223 final ArrayList<String> res = new ArrayList<String>();
224 if (ParametersChecker.isEmpty(xml)) {
225 return res;
226 }
227 final Document document;
228 try {
229 final InputStream stream =
230 new ByteArrayInputStream(xml.getBytes(WaarpStringUtils.UTF8));
231 final DocumentBuilderFactory factory = getDocumentBuilderFactory();
232 document = factory.newDocumentBuilder().parse(stream);
233 } catch (final Exception e) {
234 throw new DAOConnectionException(e);
235 }
236 document.getDocumentElement().normalize();
237
238 final NodeList hostsList = document.getElementsByTagName(HOSTID);
239 for (int i = 0; i < hostsList.getLength(); i++) {
240 res.add(hostsList.item(i).getTextContent());
241 }
242 return res;
243 }
244
245 private List<RuleTask> retrieveTasks(final String xml)
246 throws DAOConnectionException {
247 final ArrayList<RuleTask> res = new ArrayList<RuleTask>();
248 if (ParametersChecker.isEmpty(xml)) {
249 return res;
250 }
251 final Document document;
252 try {
253 final InputStream stream =
254 new ByteArrayInputStream(xml.getBytes(WaarpStringUtils.UTF8));
255 final DocumentBuilderFactory factory = getDocumentBuilderFactory();
256 document = factory.newDocumentBuilder().parse(stream);
257 } catch (final Exception e) {
258 throw new DAOConnectionException(e);
259 }
260 document.getDocumentElement().normalize();
261
262 final NodeList tasksList = document.getElementsByTagName(TASK_NODE);
263 for (int i = 0; i < tasksList.getLength(); i++) {
264 final Node node = tasksList.item(i);
265 if (node.getNodeType() == Node.ELEMENT_NODE) {
266 final Element e = (Element) node;
267 final String type =
268 e.getElementsByTagName(TYPE_FIELD).item(0).getTextContent();
269 final String path =
270 e.getElementsByTagName(PATH_FIELD).item(0).getTextContent();
271 final int delay = Integer.parseInt(
272 e.getElementsByTagName(DELAY_FIELD).item(0).getTextContent());
273 res.add(new RuleTask(type, path, delay));
274 }
275 }
276 return res;
277 }
278
279 @Override
280 protected final boolean isDbTransfer() {
281 return false;
282 }
283 }