1
package org.hisp.gtool.action;
4
import java.sql.Connection;
5
import java.sql.PreparedStatement;
6
import java.sql.ResultSet;
7
import java.sql.Statement;
8
import java.util.ArrayList;
9
import java.util.Hashtable;
10
import java.util.List;
12
import javax.xml.parsers.DocumentBuilder;
13
import javax.xml.parsers.DocumentBuilderFactory;
14
import javax.xml.transform.Result;
15
import javax.xml.transform.Source;
16
import javax.xml.transform.Transformer;
17
import javax.xml.transform.TransformerConfigurationException;
18
import javax.xml.transform.TransformerException;
19
import javax.xml.transform.TransformerFactory;
20
import javax.xml.transform.dom.DOMSource;
21
import javax.xml.transform.stream.StreamResult;
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.xml.sax.SAXException;
28
import org.xml.sax.SAXParseException;
30
public class DataValidationAction {
32
Connection con = (new DBConnection()).openConnection();
33
String dataValidationXMLFileName = "C:\\Program Files\\DHIS2\\XMLFiles\\DataValidations.xml";
36
* To retrieve all the data validations details
38
public Hashtable getAllDataValidations()
40
Hashtable ht = new Hashtable();
42
String dataValidationID = "";
46
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
47
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
48
Document doc = docBuilder.parse (new File(dataValidationXMLFileName));
50
// normalize text representation doc.getDocumentElement ().normalize ();
51
//System.out.println ("Root element of the doc is " +
52
// doc.getDocumentElement().getNodeName());
55
NodeList listOfDataValidations = doc.getElementsByTagName("data-validation");
56
int totalDataValidations = listOfDataValidations.getLength();
57
System.out.println("File Name : "+dataValidationXMLFileName);
58
System.out.println("Total no of Rules : " + totalDataValidations);
60
for(int s=0; s<totalDataValidations ; s++)
62
Node dataValidationNode = listOfDataValidations.item(s);
64
if(dataValidationNode.getNodeType() == Node.ELEMENT_NODE)
66
Element dataValidationElement = (Element)dataValidationNode;
67
dataValidationID = dataValidationElement.getAttribute("id");
69
NodeList dataValidationNameList = dataValidationElement.getElementsByTagName("name");
70
Element dataValidationNameElement = (Element)dataValidationNameList.item(0);
72
NodeList textDVNList = dataValidationNameElement.getChildNodes();
73
li.add(0,((Node)textDVNList.item(0)).getNodeValue().trim());
74
System.out.println("ID : "+dataValidationID);
75
System.out.println("Name : " +
76
((Node)textDVNList.item(0)).getNodeValue().trim());
78
NodeList dataValidationLeftDEIdsList = dataValidationElement.getElementsByTagName("left-deids");
79
Element dataValidationLeftDEIdsElement = (Element)dataValidationLeftDEIdsList.item(0);
81
NodeList textDVLdeIdsList = dataValidationLeftDEIdsElement.getChildNodes();
82
li.add(1,((Node)textDVLdeIdsList.item(0)).getNodeValue().trim());
83
String leftDENames = getDVDataElementList(((Node)textDVLdeIdsList.item(0)).getNodeValue().trim());
84
System.out.println("LeftDEIds : " +
85
((Node)textDVLdeIdsList.item(0)).getNodeValue().trim());
87
NodeList dataValidationRightDEIdsList = dataValidationElement.getElementsByTagName("right-deids");
88
Element dataValidationRightDEIdsElement = (Element)dataValidationRightDEIdsList.item(0);
90
NodeList textDVRdeIdsList = dataValidationRightDEIdsElement.getChildNodes();
91
li.add(2,((Node)textDVRdeIdsList.item(0)).getNodeValue().trim());
92
String rightDENames = getDVDataElementList(((Node)textDVRdeIdsList.item(0)).getNodeValue().trim());
93
System.out.println("RightDEIds : " +
94
((Node)textDVRdeIdsList.item(0)).getNodeValue().trim());
96
NodeList dataValidationOperatorList = dataValidationElement.getElementsByTagName("operator");
97
Element dataValidationOperatorElement = (Element)dataValidationOperatorList.item(0);
99
NodeList textDVOperatorList = dataValidationOperatorElement.getChildNodes();
100
li.add(3,((Node)textDVOperatorList.item(0)).getNodeValue().trim());
101
System.out.println("Operator : " +
102
((Node)textDVOperatorList.item(0)).getNodeValue().trim());
104
NodeList dataValidationTypeList = dataValidationElement.getElementsByTagName("type");
105
Element dataValidationTypeElement = (Element)dataValidationTypeList.item(0);
107
NodeList textDVTypeList = dataValidationTypeElement.getChildNodes();
108
li.add(4,((Node)textDVTypeList.item(0)).getNodeValue().trim());
109
System.out.println("Type : " +
110
((Node)textDVTypeList.item(0)).getNodeValue().trim());
112
NodeList dataValidationLeftDescList = dataValidationElement.getElementsByTagName("left-desc");
113
Element dataValidationLeftDescElement = (Element)dataValidationLeftDescList.item(0);
115
NodeList textDVLeftDescList = dataValidationLeftDescElement.getChildNodes();
116
li.add(5,((Node)textDVLeftDescList.item(0)).getNodeValue().trim());
117
System.out.println("LeftDescription : " +
118
((Node)textDVLeftDescList.item(0)).getNodeValue().trim());
120
NodeList dataValidationRightDescList = dataValidationElement.getElementsByTagName("right-desc");
121
Element dataValidationRightDescElement = (Element)dataValidationRightDescList.item(0);
123
NodeList textDVRightDescList = dataValidationRightDescElement.getChildNodes();
124
li.add(6,((Node)textDVRightDescList.item(0)).getNodeValue().trim());
125
System.out.println("RightDescription : " +
126
((Node)textDVRightDescList.item(0)).getNodeValue().trim());
128
li.add(7,leftDENames);
129
System.out.println("Left DataElements : " +leftDENames);
130
li.add(8,rightDENames);
131
System.out.println("Right DataElements : " +rightDENames);
133
NodeList dataValidationLeftPercentList = dataValidationElement.getElementsByTagName("left-percent");
134
Element dataValidationLeftPercentElement = (Element)dataValidationLeftPercentList.item(0);
136
NodeList textDVLeftPercentList = dataValidationLeftPercentElement.getChildNodes();
137
li.add(9,((Node)textDVLeftPercentList.item(0)).getNodeValue().trim());
138
System.out.println("LeftPercentage : " +
139
((Node)textDVLeftPercentList.item(0)).getNodeValue().trim());
141
NodeList dataValidationRightPercentList = dataValidationElement.getElementsByTagName("right-percent");
142
Element dataValidationRightPercentElement = (Element)dataValidationRightPercentList.item(0);
144
NodeList textDVRightPercentList = dataValidationRightPercentElement.getChildNodes();
145
li.add(10,((Node)textDVRightPercentList.item(0)).getNodeValue().trim());
146
System.out.println("RightPercentage : " +
147
((Node)textDVRightPercentList.item(0)).getNodeValue().trim());
149
ht.put(dataValidationID,li);
153
}//end of for loop with s var
155
catch (SAXParseException err)
157
System.out.println ("** Parsing error" + ", line "
158
+ err.getLineNumber () + ", uri " + err.getSystemId ());
159
System.out.println(" " + err.getMessage ());
161
catch (SAXException e)
163
Exception x = e.getException ();
164
((x == null) ? e : x).printStackTrace ();
168
t.printStackTrace ();
172
}//end of getAllDataValidations
175
* To get the value for leftside deids and rightside deids and finally the datavalidation status
177
public List getDataValidationStatus( int selOrgUnitID,
189
int dvrightvalue = 0;
191
List li = new ArrayList();
193
Hashtable htForDVOperator = new Hashtable();
194
htForDVOperator.put("Equal","=");
195
htForDVOperator.put("Less","<");
196
htForDVOperator.put("LessOrEqual","<=");
197
htForDVOperator.put("Greater",">");
198
htForDVOperator.put("GreaterOrEqual",">=");
200
Statement st1 = null;
201
Statement st2 = null;
202
ResultSet rs1 = null;
203
ResultSet rs2 = null;
205
String displayOpt = "dataelement.name";
206
if(localLang == null) displayOpt = "dataelement.alternativeName";
209
-- Aggregateddatavalue
210
String query = "SELECT SUM(value) FROM aggregateddatavalue " +
211
"WHERE organisationUnitId = "+selOrgUnitID+" AND " +
212
"periodId = "+periodID+" AND " +
213
"dataElementId IN ("+dvleftdeids+")";
217
String query = "SELECT value FROM datavalue " +
218
"WHERE source = "+selOrgUnitID+" AND " +
219
"period = "+periodID+" AND " +
220
"dataElement IN ("+dvleftdeids+")";
223
String query = "SELECT dataelement.id,"+displayOpt+",datavalue.value " +
224
"FROM datavalue INNER JOIN dataelement " +
225
"ON datavalue.dataElement = dataelement.id " +
226
"WHERE source = "+selOrgUnitID+" AND period = "+periodID+" AND dataElement IN ("+dvleftdeids+")";
228
String query = "SELECT dataelement.dataelementid,"+displayOpt+",datavalue.value " +
229
"FROM datavalue INNER JOIN dataelement " +
230
"ON datavalue.dataelementid = dataelement.dataelementid " +
231
"WHERE datavalue.sourceid = "+selOrgUnitID+" AND datavalue.periodid = "+periodID+" AND datavalue.dataelementid IN ("+dvleftdeids+")";
233
String strLeftDEID = "";
234
String strLeftDENames = "";
235
String strLeftDEValues = "";
237
String strRightDEID = "";
238
String strRightDENames = "";
239
String strRightDEValues = "";
243
st1 = con.createStatement();
244
st2 = con.createStatement();
246
rs1 = st1.executeQuery(query);
249
strLeftDEID += rs1.getInt(1)+",";
250
strLeftDENames += rs1.getString(2)+",";
251
strLeftDEValues += rs1.getInt(3)+",";
252
dvleftvalue += rs1.getInt(3);
255
double tempdvleftvalue = dvleftvalue + (dvleftvalue * leftPercent/100);
256
System.out.println("LeftValue: "+dvleftvalue);
259
-- Aggregateddatavalue
260
query = "SELECT SUM(value) FROM aggregateddatavalue " +
261
"WHERE organisationUnitId = "+selOrgUnitID+" AND " +
262
"periodId = "+periodID+" AND " +
263
"dataElementId IN ("+dvrightdeids+")";
266
query = "SELECT SUM(value) FROM datavalue " +
267
"WHERE source = "+selOrgUnitID+" AND " +
268
"period = "+periodID+" AND " +
269
"dataElement IN ("+dvrightdeids+")";
272
query = "SELECT dataelement.id,"+displayOpt+",datavalue.value " +
273
"FROM datavalue INNER JOIN dataelement " +
274
"ON datavalue.dataElement = dataelement.id " +
275
"WHERE source = "+selOrgUnitID+" AND period = "+periodID+" AND dataElement IN ("+dvrightdeids+")";
279
query = "SELECT dataelement.dataelementid,"+displayOpt+",datavalue.value " +
280
"FROM datavalue INNER JOIN dataelement " +
281
"ON datavalue.dataelementid = dataelement.dataelementid " +
282
"WHERE datavalue.sourceid = "+selOrgUnitID+" AND datavalue.periodid = "+periodID+" AND datavalue.dataelementid IN ("+dvrightdeids+")";
284
rs2 = st2.executeQuery(query);
287
strRightDEID += rs2.getInt(1)+",";
288
strRightDENames += rs2.getString(2)+",";
289
strRightDEValues += rs2.getInt(3)+",";
290
dvrightvalue += rs2.getInt(3);
293
double tempdvrightvalue = dvrightvalue + (dvrightvalue * rightPercent/100);
294
System.out.println("OUID: "+selOrgUnitID+"Period: "+periodID+"RV: "+dvrightvalue);
296
if(getDVStatusValue(tempdvleftvalue,tempdvrightvalue,dvoperator)) dvStatus = "T";
298
li.add(0,""+dvleftvalue);
299
li.add(1,""+dvrightvalue);
301
li.add(3,(String) htForDVOperator.get(dvoperator));
302
li.add(4,strLeftDEID);
303
li.add(5,strLeftDENames);
304
li.add(6,strLeftDEValues);
305
li.add(7,strRightDEID);
306
li.add(8,strRightDENames);
307
li.add(9,strRightDEValues);
310
catch(Exception e) { System.out.println("Some Exception : "+e.getMessage()); return null; }
315
if(rs1!=null) rs1.close();
316
if(rs2!=null) rs2.close();
318
if(st1!=null) st1.close();
319
if(st2!=null) st2.close();
321
catch(Exception e){ System.out.println("Some Exception : "+e.getMessage()); return null;}
322
}// finally block end
325
}//getDataValidationStatus end
329
* To retrieve the data validation status value
331
public boolean getDVStatusValue(double dvleftvalue,double dvrightvalue,String dvoperator)
333
if( (dvoperator.equals("Equal")) && (dvleftvalue == dvrightvalue) ) return true;
334
else if( (dvoperator.equals("Less")) && (dvleftvalue < dvrightvalue) ) return true;
335
else if( (dvoperator.equals("LessOrEqual") || dvoperator.equals("Correlates")) && (dvleftvalue <= dvrightvalue) ) return true;
336
else if( (dvoperator.equals("Greater")) && (dvleftvalue > dvrightvalue) ) return true;
337
else if( (dvoperator.equals("GreaterOrEqual")) && (dvleftvalue >= dvrightvalue) ) return true;
340
}// getDVStatusValue end
344
* To get the names of Leftside DataElements and Rightside DataElements
346
public String getDVDataElementList(String deIds)
348
Statement st1 = null;
349
ResultSet rs1 = null;
351
//String query ="SELECT shortName FROM dataelement WHERE id IN ("+deIds+")";
352
String query ="SELECT name FROM dataelement WHERE dataelementid IN ("+deIds+")";
357
st1 = con.createStatement();
358
rs1 = st1.executeQuery(query);
361
denames += rs1.getString(1)+",";
364
catch(Exception e) { System.out.println("Some Exception : "+e.getMessage()); return null; }
369
if(rs1!=null) rs1.close();
370
if(st1!=null) st1.close();
372
catch(Exception e){ System.out.println("Some Exception : "+e.getMessage()); return null;}
373
}// finally block end
376
}//getDVDataElementList end
379
* To add new validation Rule
381
public boolean addDataValidation(List li)
383
String dvID = (String) li.get(0);
384
String dvName = (String) li.get(1);
385
String leftDesc = (String) li.get(2);
386
String rightDesc = (String) li.get(3);
387
String dvOperator = (String) li.get(4);
388
String dvType = (String) li.get(5);
389
String leftSelDEs = (String) li.get(6);
390
String rightSelDEs = (String) li.get(7);
391
String leftPercent = (String) li.get(8);
392
String rightPercent = (String) li.get(9);
396
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
397
Document doc = docBuilderFactory.newDocumentBuilder().parse(new File(dataValidationXMLFileName));
399
Element dv_ele = doc.createElement("data-validation");
400
Element name_ele = doc.createElement("name");
401
Element leftdeids_ele = doc.createElement("left-deids");
402
Element rightdeids_ele = doc.createElement("right-deids");
403
Element ope_ele = doc.createElement("operator");
404
Element type_ele = doc.createElement("type");
405
Element leftdesc_ele = doc.createElement("left-desc");
406
Element rightdesc_ele = doc.createElement("right-desc");
407
Element leftPercent_ele = doc.createElement("left-percent");
408
Element rightPercent_ele = doc.createElement("right-percent");
410
Node name_txt = doc.createTextNode(dvName);
411
Node leftdeids_txt = doc.createTextNode(leftSelDEs);
412
Node rightdeids_txt = doc.createTextNode(rightSelDEs);
413
Node ope_txt = doc.createTextNode(dvOperator);
414
Node type_txt = doc.createTextNode(dvType);
415
Node leftdesc_txt = doc.createTextNode(leftDesc);
416
Node rightdesc_txt = doc.createTextNode(rightDesc);
417
Node leftPercent_txt = doc.createTextNode(leftPercent);
418
Node rightPercent_txt = doc.createTextNode(rightPercent);
420
name_ele.appendChild(name_txt);
421
leftdeids_ele.appendChild(leftdeids_txt);
422
rightdeids_ele.appendChild(rightdeids_txt);
423
ope_ele.appendChild(ope_txt);
424
type_ele.appendChild(type_txt);
425
leftdesc_ele.appendChild(leftdesc_txt);
426
rightdesc_ele.appendChild(rightdesc_txt);
427
leftPercent_ele.appendChild(leftPercent_txt);
428
rightPercent_ele.appendChild(rightPercent_txt);
430
dv_ele.appendChild(name_ele);
431
dv_ele.appendChild(leftdeids_ele);
432
dv_ele.appendChild(rightdeids_ele);
433
dv_ele.appendChild(ope_ele);
434
dv_ele.appendChild(type_ele);
435
dv_ele.appendChild(leftdesc_ele);
436
dv_ele.appendChild(rightdesc_ele);
437
dv_ele.appendChild(leftPercent_ele);
438
dv_ele.appendChild(rightPercent_ele);
440
dv_ele.setAttribute("id",dvID);
442
Element root_ele = doc.getDocumentElement();
443
root_ele.appendChild(dv_ele);
446
Source source = new DOMSource(doc);
447
File file = new File(dataValidationXMLFileName);
448
Result result = new StreamResult(file);
449
Transformer xformer = TransformerFactory.newInstance().newTransformer();
450
xformer.transform(source, result);
452
catch (TransformerConfigurationException e) { System.out.println(e.getMessage()); return false; }
453
catch (TransformerException e) { System.out.println(e.getMessage()); return false; }
455
catch (SAXParseException err)
457
System.out.println ("** Parsing error" + ", line "
458
+ err.getLineNumber () + ", uri " + err.getSystemId ());
459
System.out.println(" " + err.getMessage ());
461
catch (SAXException e)
463
Exception x = e.getException ();
464
((x == null) ? e : x).printStackTrace ();
468
t.printStackTrace ();
471
}//end addDataValidation
473
public boolean editDataValidation(List li)
475
boolean removeStatus = removeDataValidation((String) li.get(0));
476
boolean addStatus = true;
477
if(removeStatus) addStatus = addDataValidation(li);
479
if(addStatus) return true;
484
* To edit validation Rule based on its id
487
public boolean editDataValidation(List li)
489
String dvID = (String) li.get(0);
490
String dvName = (String) li.get(1);
491
String leftDesc = (String) li.get(2);
492
String rightDesc = (String) li.get(3);
493
String dvOperator = (String) li.get(4);
494
String dvType = (String) li.get(5);
495
String leftSelDEs = (String) li.get(6);
496
String rightSelDEs = (String) li.get(7);
500
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
501
Document doc = docBuilderFactory.newDocumentBuilder().parse(new File(dataValidationXMLFileName));
503
Element dv_ele = doc.createElement("data-validation");
504
Element name_ele = doc.createElement("name");
505
Element leftdeids_ele = doc.createElement("left-deids");
506
Element rightdeids_ele = doc.createElement("right-deids");
507
Element ope_ele = doc.createElement("operator");
508
Element type_ele = doc.createElement("type");
509
Element leftdesc_ele = doc.createElement("left-desc");
510
Element rightdesc_ele = doc.createElement("right-desc");
512
Node name_txt = doc.createTextNode(dvName);
513
Node leftdeids_txt = doc.createTextNode(leftSelDEs);
514
Node rightdeids_txt = doc.createTextNode(rightSelDEs);
515
Node ope_txt = doc.createTextNode(dvOperator);
516
Node type_txt = doc.createTextNode(dvType);
517
Node leftdesc_txt = doc.createTextNode(leftDesc);
518
Node rightdesc_txt = doc.createTextNode(rightDesc);
520
name_ele.appendChild(name_txt);
521
leftdeids_ele.appendChild(leftdeids_txt);
522
rightdeids_ele.appendChild(rightdeids_txt);
523
ope_ele.appendChild(ope_txt);
524
type_ele.appendChild(type_txt);
525
leftdesc_ele.appendChild(leftdesc_txt);
526
rightdesc_ele.appendChild(rightdesc_txt);
528
dv_ele.appendChild(name_ele);
529
dv_ele.appendChild(leftdeids_ele);
530
dv_ele.appendChild(rightdeids_ele);
531
dv_ele.appendChild(ope_ele);
532
dv_ele.appendChild(type_ele);
533
dv_ele.appendChild(leftdesc_ele);
534
dv_ele.appendChild(rightdesc_ele);
536
dv_ele.setAttribute("id",dvID);
538
Element root_ele = doc.getDocumentElement();
539
//root_ele.appendChild(dv_ele);
541
NodeList nl=root_ele.getElementsByTagName("data-validation");
542
for (int i=0;i<nl.getLength();i++)
544
Element existing_dv =(Element) nl.item(i);
545
if (existing_dv.getAttribute("id").equals(dvID))
546
root_ele.replaceChild(dv_ele, existing_dv);
551
Source source = new DOMSource(doc);
552
File file = new File(dataValidationXMLFileName);
553
Result result = new StreamResult(file);
554
Transformer xformer = TransformerFactory.newInstance().newTransformer();
555
xformer.transform(source, result);
557
catch (TransformerConfigurationException e) { System.out.println(e.getMessage()); return false; }
558
catch (TransformerException e) { System.out.println(e.getMessage()); return false; }
560
catch (SAXParseException err)
562
System.out.println ("** Parsing error" + ", line "
563
+ err.getLineNumber () + ", uri " + err.getSystemId ());
564
System.out.println(" " + err.getMessage ());
566
catch (SAXException e)
568
Exception x = e.getException ();
569
((x == null) ? e : x).printStackTrace ();
573
t.printStackTrace ();
576
}//end editDataValidation
580
* To Remove the Validation based on validation id
582
public boolean removeDataValidation(String dvID)
587
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
588
Document doc = docBuilderFactory.newDocumentBuilder().parse(new File(dataValidationXMLFileName));
590
Element root_ele = doc.getDocumentElement();
591
NodeList nl = root_ele.getElementsByTagName("data-validation");
592
for(i=0; i<nl.getLength();i++)
594
Element dv_ele = (Element) nl.item(i);
595
if(dv_ele.getAttribute("id").equals(dvID))
597
root_ele.removeChild(dv_ele);
602
if(i != -1) { System.out.println("Validation Not Found with that id"); return false;}
605
// Prepare the DOM document for writing
606
Source source = new DOMSource(doc);
607
// Prepare the output file
608
File file = new File(dataValidationXMLFileName);
609
Result result = new StreamResult(file);
610
// Write the DOM document to the file
611
Transformer xformer = TransformerFactory.newInstance().newTransformer();
612
xformer.transform(source, result);
614
catch (TransformerConfigurationException e) { System.out.println(e.getMessage()); return false;}
615
catch (TransformerException e) {System.out.println(e.getMessage()); return false;}
617
catch (SAXParseException err)
619
System.out.println ("** Parsing error" + ", line "
620
+ err.getLineNumber () + ", uri " + err.getSystemId ());
621
System.out.println(" " + err.getMessage ());
624
catch (SAXException e)
626
Exception x = e.getException ();
627
((x == null) ? e : x).printStackTrace ();
632
t.printStackTrace ();
635
System.out.println("Successfully Removed");
637
} //removeDataValidation
642
public int correctDVDataValues(int oUID,int dEID, int pID, int dValue)
644
PreparedStatement ps = null;
646
//String query ="UPDATE datavalue SET value=? WHERE source="+oUID+" AND dataElement="+dEID+" AND period="+pID;
647
String query ="UPDATE datavalue SET value=? WHERE sourceid="+oUID+" AND dataelementid="+dEID+" AND periodid="+pID;
651
ps = con.prepareStatement(query);
653
result = ps.executeUpdate();
654
System.out.println(oUID+" "+dEID+" "+pID+" "+dValue+" "+result);
656
catch(Exception e) { System.out.println("Some Exception : "+e.getMessage()); return -1; }
661
if(ps!=null) ps.close();
663
catch(Exception e){ System.out.println("Some Exception : "+e.getMessage()); return -1;}
664
}// finally block end
666
}//correctDVDataValues