-
Notifications
You must be signed in to change notification settings - Fork 0
/
StarDomParser.java
130 lines (115 loc) · 4.28 KB
/
StarDomParser.java
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
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class StarDomParser {
private List<Star> stars = new ArrayList<>();
private Document dom;
private int starIdCount = 1; // Start from 1 or another starting point
private Connection conn;
public StarDomParser() throws SQLException, ClassNotFoundException {
init();
}
private void init() throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/moviedb?autoReconnect=true&useSSL=false", "mytestuser", "My6$Password");
}
public void runExample() {
try {
parseXmlFile();
parseDocument();
printData();
insertStars();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (conn != null) conn.close(); // Ensure connection is closed
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private void parseXmlFile() {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
dom = dBuilder.parse("actors63.xml");
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
}
private void parseDocument() {
Element docElement = dom.getDocumentElement();
NodeList nodeList = docElement.getElementsByTagName("actor");
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
Star star = parseStar(element);
stars.add(star);
}
}
private Star parseStar(Element element) {
String id = "nm" + (9423080 + starIdCount); // Prefix "nm" added to generated ID
starIdCount++;
String name = getTextValue(element, "stagename");
int birthYear = getIntValue(element, "dob");
return new Star(id, name, birthYear);
}
private String getTextValue(Element elem, String tagName) {
NodeList nl = elem.getElementsByTagName(tagName);
if (nl != null && nl.getLength() > 0) {
Element el = (Element) nl.item(0);
if (el.getFirstChild() != null) {
return el.getFirstChild().getNodeValue();
}
}
return null;
}
private int getIntValue(Element elem, String tagName) {
try {
return Integer.parseInt(getTextValue(elem, tagName));
} catch (NumberFormatException e) {
e.printStackTrace();
return -1; // Use -1 as default/error value
}
}
private void printData() {
System.out.println("Total parsed " + stars.size() + " stars including duplicates");
for (Star star : stars) {
System.out.println("\t" + star);
}
}
private void insertStars() throws SQLException {
conn.setAutoCommit(false);
String callSQL = "{CALL InsertStar(?, ?, ?)}"; // SQL to call the stored procedure
try (CallableStatement cstmt = conn.prepareCall(callSQL)) {
int count = 0;
for (Star star : stars) {
cstmt.setString(1, star.getId());
cstmt.setString(2, star.getName());
cstmt.setInt(3, star.getBirthYear());
cstmt.addBatch(); // Add to batch
count++;
if (count % 1000 == 0 || count == stars.size()) {
cstmt.executeBatch(); // Execute batch
conn.commit(); // Commit transaction
}
}
}
}
public static void main(String[] args) {
try {
StarDomParser domParser = new StarDomParser();
domParser.runExample();
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}