-
Notifications
You must be signed in to change notification settings - Fork 0
/
XMLHandler.java
379 lines (311 loc) · 13.4 KB
/
XMLHandler.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
package xmlHandling;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import listDataStructure.AudioItem;
import listDataStructure.BasicItem;
import listDataStructure.ChuseList;
import listDataStructure.ImageItem;
import listDataStructure.RankingList;
import listDataStructure.VideoItem;
/**
* Class to handle the creation, reading and editing of list XML files.
*
* Date created: 31/01/2019
* Date last edited: 15/03/2019
* Last edited by: Dan Jackson
*
* @author Jack Small
*
*/
public abstract class XMLHandler {
/**
* buildListFromXML (String)
*
* Builds the list from the XML file with the name "String" in the local directory.
* Returns a list of items in the form of a ChuseList class.
*
* @param filename - the filename/filepath of the XML file
* @return list - the list created from the XML reader
*/
public static ChuseList buildListFromXML(String filename){
// this line is need for XML handling (don't know why :) )
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// List of items that will be used to store the content from the XML file
ArrayList<BasicItem> list_array = new ArrayList<BasicItem>();
try {
// this line can cause an error there for a try is need
// this line is need for XML handling (don't know why :) )
DocumentBuilder builder = factory.newDocumentBuilder();
// location of XML file - local to the project folder
File file = new File(filename);
// build doc from XML file into java
// this line can cause an error there for a try is need
// this line is need for XML handling (don't know why :) )
Document document = builder.parse(file);
NodeList id_check = document.getElementsByTagName("id");
if(id_check.getLength() != 1) {
return null;
}
for(int j=1; j < id_check.item(0).getChildNodes().getLength(); j += 2) {
//System.out.println("j value:" + j);
if(!id_check.item(0).getChildNodes().item(j).getNodeName().equals("page")){
continue;
}
// set nodes in XML file in to array by the node tag name
//NodeList element_list = document.getElementsByTagName("multimedia");
NodeList element_list = id_check.item(0).getChildNodes().item(j).getChildNodes();
// loop through all nodes in the node list that was copied from the XML file
for(int i = 0; i < element_list.getLength(); i++){
// get node i from node array that came from XML file
Node element = element_list.item(i);
if(!element.getNodeName().equals("multimedia")) {
continue;
}
//item 1 is type
//item 3 is title
//item 5 is location
// Temp variable for getting the item from the node
BasicItem item = null;
// Checks if node is of class BasicItem, if not it cycles through all available
// class types until the right one is found. At that point it builds the item of that class.
if(element.getChildNodes().item(1).getTextContent().equals("BasicItem")) {
item = new BasicItem(element.getChildNodes().item(3).getTextContent());
} else if(element.getChildNodes().item(1).getTextContent().equals("ImageItem")) {
item = new ImageItem(element.getChildNodes().item(5).getTextContent());
} else if(element.getChildNodes().item(1).getTextContent().equals("AudioItem")) {
item = new AudioItem(element.getChildNodes().item(5).getTextContent());
} else if(element.getChildNodes().item(1).getTextContent().equals("VideoItem")) {
item = new VideoItem(element.getChildNodes().item(3).getTextContent(),
// The XML goes through all available information of node.
// For some reason XML counts up in odd numbers :(
element.getChildNodes().item(5).getTextContent(),
element.getChildNodes().item(7).getTextContent(),
element.getChildNodes().item(9).getTextContent());
} else {
continue;
}
// dumps the newly made item into the list array
list_array.add(item);
}
}
} catch (ParserConfigurationException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Creates a new "ChuseList" and sets it equal to null
ChuseList list = null;
if(list_array.size() > 0){
//Stores array of items in a "ChuseList" with the file name of the XML file
list = new ChuseList();
list.addItemArray(list_array);
}
// return the list made
return list;
}
/**
* buildXMLFromList(ChuseList, String, ChuseList)
*
* build XML file from list and name it the "filename" which is passed to it
* note : it will be stored in the local directory
*
* use : for storing the list in a ChuseList class to be accessed by "buildListFromXML"
*
* @param list - the list to build the XML file from
* @param filename - the filename to write the XML file to
* @param results - the results to add to the XML file
*/
public static void buildXMLFromList(ChuseList list, String file_path, RankingList results){
// this line is need for XML handling (don't know why :) )
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
// this line is need for XML handling (don't know why :) )
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
// add node called "id" to the XML file
Element id = document.createElement("id");
document.appendChild(id);
// add the page tag with all "multimedia" tags
// where each one hold the information of an item in the list that is being stored
document = addPage(document, id, list);
// working on it
// check if the list has statistics from previous algorithm runs.
if(results != null) {
// not today
// NEW -------------------------------------------------------------------------------
document = addResults(document, id, results);
}
// this line is need for XML handling (don't know why :) )
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transf = transformerFactory.newTransformer();
// top tags for the XML formating
transf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transf.setOutputProperty(OutputKeys.INDENT, "yes");
transf.setOutputProperty(OutputKeys.STANDALONE, "yes");
transf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
// builds the XML with the document made
DOMSource source = new DOMSource(document);
// file path to where its being stored
File myFile = new File(file_path);
// print list with tags in console
///StreamResult console = new StreamResult(System.out);
// write to file in given location
StreamResult file = new StreamResult(myFile);
try {
transf.transform(source, file);
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* Method to build an XML file from a list, but not add the results of the list to
* the XML file.
*
* @param list - the list to build the XML file from
* @param filename - the filename to write the XML file to
*/
public static void buildXMLFromList(ChuseList list, String file_path) {
buildXMLFromList(list, file_path, null);
}
/**
* addPage(Document, Element, ChuseList)
*
* Ads the page tag and creates items with the right class type via the create item method.
* note : called within "buildXMLFromList" method
*
* use : used for XML handling of method "buildXMLFromList"
*
* @param document - the XML document to edit
* @param id - the id XML tag element
* @param list - the list to add to the page
* @return document - the edited document
*/
private static Document addPage(Document document, Element id, ChuseList list) {
// add page tag
Element page = document.createElement("page");
id.appendChild(page);
// loop through all list items and add them to the XML file under the page tag
for(int i = 0; i < list.getSize(); i++) {
page.appendChild(createItem(document, list.get(i)));
}
// return the document which is being stored
return document;
}
// NEW ----------------------------------------
private static Document addResults(Document document, Element id, RankingList list) {
// add page tag
Element results = document.createElement("results");
id.appendChild(results);
// loop through all list items and add them to the XML file under the page tag
for(int i = 0; i < list.getSize(); i++) {
// add the item
Node multimediaForResults = createItem(document, list.get(i).getWrappedItem());
// append the ranking to the node
multimediaForResults.appendChild(createItemElement(document, "points", Integer.toString(list.get(i).getRanking())));
// append to the results tag
results.appendChild(multimediaForResults);
}
// return the document which is being stored
return document;
}
// -------------------------------------------
/**
* Work in progress.
* TODO update later in development for statistics
*
* @param results
* @param filename
*/
public static void addResultsToXML(ChuseList results, String file_path) {
ChuseList page_1 = buildListFromXML(file_path);
//XMLHandler.buildXMLFromList(page_1, file_path, results);
}
/**
* createItem(Document, BasicItem)
*
* Creates item with the right class type and ads its information to the document.
* note : this is called within the "addPage" method.
*
* use : used for XML handling of method "addPage"
*
* @param document - the document to edit
* @param item - the item to add to the document
* @return multimedia - the multimedia XML node
*/
private static Node createItem(Document document, BasicItem item) {
// add multimedia tag
Node multimedia = document.createElement("multimedia");
// add type tag under multimedia tag
multimedia.appendChild(createItemElement(document, "type", item.getType()));
// add title tag under multimedia tag
multimedia.appendChild(createItemElement(document, "title", item.getTitle()));
// Checks the class type of the item
if(item.getType() == "BasicItem") {
// If class is basic item then it receives no path.
multimedia.appendChild(createItemElement(document, "path", "n/a"));
} else if(item.getType() == "ImageItem") {
// If item type is ImageItem, it gets the stored path and adds it to document.
multimedia.appendChild(createItemElement(document, "path", item.getPath()));
} else if(item.getType() == "AudioItem") {
//If item type is AudioItem it gets the stored path and adds it to the document.
multimedia.appendChild(createItemElement(document, "path", item.getPath()));
} else if(item.getType() == "VideoItem") {
// If item is of type VideoItem it will get the path, the meta data and channel and add it to
// the document.
multimedia.appendChild(createItemElement(document, "path", item.getPath()));
multimedia.appendChild(createItemElement(document, "description", item.getMetadata().get(0)));
multimedia.appendChild(createItemElement(document, "channel", item.getMetadata().get(1)));
}
// Returns the new multimedia tag.
return multimedia;
}
/**
* createItemElement(Document, String, String)
*
* Adds name and value to a node(XML).
* note : this is called within the "createItem" method.
*
* @param document - the document to edit
* @param name - the name of the node
* @param value - the value of the node (String)
* @return node - the new node
*/
private static Node createItemElement(Document document, String name,
String value) {
// make new node with name "name"
Node node = document.createElement(name);
// add value "value" to this node with name "name"
node.appendChild(document.createTextNode(value));
// return the node
return node;
}
}