Skip to content

Commit 7bf2396

Browse files
committed
Main update -> Updated arg handling
1 parent 5a64d99 commit 7bf2396

File tree

2 files changed

+38
-20
lines changed

2 files changed

+38
-20
lines changed

src/main/java/com/codepressed/CSVtoXML/Main.java renamed to src/main/java/com/codepressed/csvToXml/Main.java

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.codepressed.CSVtoXML;
1+
package com.codepressed.csvToXml;
22

33

44
import org.w3c.dom.Document;
@@ -9,11 +9,13 @@
99

1010
public class Main {
1111
private static final Logger logger = Logger.getLogger(Main.class.getName());
12+
private static final String CSV_COMMA = ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)";
13+
private static final String CSV_SEMICOLON = ";(?=([^\"]*\"[^\"]*\")*[^\"]*$)";
14+
private static final String SEMICOLON_PARAMETER = "-s";
1215

1316
/**
1417
* Executes the CSV to XML conversion
15-
*
16-
* @param args [0] = Input file, [1] = Output file, [2] = Elements names, [3] = csv type.
18+
* @param args [0] = Input file*, [1] = Output file*, [2] = Elements names, [3] = csv type.
1719
* @author Daniel Apesteguia Timoner (Codepressed)
1820
*/
1921
public static void main(String[] args) {
@@ -26,12 +28,14 @@ public static void main(String[] args) {
2628
//Vars Initialization
2729
String csvFile = args[0];
2830
String xmlFile = args[1];
29-
String elementName = args.length>=3 && !args[3].equals("-s") ? args[2] : "element";
30-
String csvSplit = (args.length>3 && args[3].equals("-s") || args.length>4 && args[4].equals("-s")) ? ";(?=([^\"]*\"[^\"]*\")*[^\"]*$)":",(?=([^\"]*\"[^\"]*\")*[^\"]*$)";
31+
String elementName = args.length>=3 && !args[3].equals(SEMICOLON_PARAMETER) ? args[2] : "element";
32+
String csvSplit = (args.length>3 && args[3].equals(SEMICOLON_PARAMETER) || args.length>4 && args[4].equals(SEMICOLON_PARAMETER)) ? CSV_SEMICOLON:CSV_COMMA;
3133

3234
List <String[]> elements = XMLutils.readCsvFile(csvFile, csvSplit);
3335
Document xmlDoc = XMLutils.createXmlDocument(elements, elementName);
34-
XMLutils.writeXmlDocumentToFile(xmlDoc, xmlFile);
36+
if(XMLutils.writeXmlDocumentToFile(xmlDoc, xmlFile)){
37+
logger.log(Level.INFO, "File was created successfully.");
38+
}
3539
}
3640
}
3741

src/main/java/com/codepressed/CSVtoXML/XMLutils.java renamed to src/main/java/com/codepressed/csvToXml/XMLutils.java

+28-14
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
package com.codepressed.CSVtoXML;
1+
package com.codepressed.csvToXml;
22

33
import org.w3c.dom.Document;
44
import org.w3c.dom.Element;
55
import org.w3c.dom.Text;
66

7+
import javax.xml.XMLConstants;
78
import javax.xml.parsers.DocumentBuilder;
89
import javax.xml.parsers.DocumentBuilderFactory;
910
import javax.xml.parsers.ParserConfigurationException;
@@ -14,7 +15,6 @@
1415
import javax.xml.transform.dom.DOMSource;
1516
import javax.xml.transform.stream.StreamResult;
1617
import java.io.BufferedReader;
17-
import java.io.File;
1818
import java.io.FileOutputStream;
1919
import java.io.IOException;
2020
import java.nio.file.Files;
@@ -28,30 +28,35 @@ public class XMLutils {
2828

2929
private static final Logger logger = Logger.getLogger(XMLutils.class.getName());
3030

31+
private XMLutils(){
32+
throw new IllegalStateException("This is a utility class.");
33+
}
34+
3135
public static boolean writeXmlDocumentToFile(Document xmlDoc, String xmlFilePath) {
3236
try {
3337
TransformerFactory xmlTransformerFactory = TransformerFactory.newInstance();
38+
//To protect from XXE attacks
39+
xmlTransformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
40+
xmlTransformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
41+
3442
Transformer xmlTransformer = xmlTransformerFactory.newTransformer();
3543
xmlTransformer.setOutputProperty(OutputKeys.INDENT, "yes");
3644
xmlTransformer.setOutputProperty(OutputKeys.METHOD, "xml");
3745
xmlTransformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
3846
xmlTransformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
3947

40-
try (FileOutputStream outputStream = new FileOutputStream(new File(xmlFilePath))) {
48+
try (FileOutputStream outputStream = new FileOutputStream(xmlFilePath)) {
4149
xmlTransformer.transform(new DOMSource(xmlDoc), new StreamResult(outputStream));
4250
}
4351
return true;
52+
4453
} catch (TransformerException | IOException e) {
4554
logger.log(Level.SEVERE, "Error writing xml document to file", e);
4655
return false;
4756
}
4857
}
4958

50-
public static Document createXmlDocument(List<String[]> XMLelements, String elementName) {
51-
if (elementName == null) {
52-
elementName = "element";
53-
}
54-
59+
public static Document createXmlDocument(List<String[]> xmlElements, String elementName) {
5560
try {
5661
DocumentBuilderFactory xmlFactory = DocumentBuilderFactory.newInstance();
5762
DocumentBuilder xmlBuilder = xmlFactory.newDocumentBuilder();
@@ -63,15 +68,15 @@ public static Document createXmlDocument(List<String[]> XMLelements, String elem
6368
rootElement.appendChild(mainElement);
6469

6570
boolean headerDefined = false;
66-
String[] header = new String[XMLelements.size()];
71+
String[] header = new String[xmlElements.size()];
6772

68-
for (String[] node : XMLelements) {
73+
for (String[] node : xmlElements) {
6974
if (headerDefined) {
7075
Element nodesElements = xmlDoc.createElement(elementName);
7176
mainElement.appendChild(nodesElements);
7277

7378
for (int j = 0; j < node.length; j++) {
74-
node[j] = node[j].replaceAll("\"", "").trim();
79+
node[j] = node[j].replace("\"", "").trim();
7580
Element nodesValues = xmlDoc.createElement(header[j]);
7681
nodesElements.appendChild(nodesValues);
7782
Text nodeTxt = xmlDoc.createTextNode(node[j]);
@@ -81,10 +86,8 @@ public static Document createXmlDocument(List<String[]> XMLelements, String elem
8186
header = node;
8287
for (int j = 0; j < node.length; j++) {
8388
header[j] = header[j].replaceAll("[^a-zA-Z0-9]", "");
84-
try {
85-
Integer.parseInt(header[j]);
89+
if(isParsableToInt(header[j])) {
8690
header[j] = "node" + header[j];
87-
} catch (NumberFormatException e) {
8891
}
8992
}
9093
headerDefined = true;
@@ -97,6 +100,7 @@ public static Document createXmlDocument(List<String[]> XMLelements, String elem
97100
}
98101
}
99102

103+
100104
public static List<String[]> readCsvFile(String csvFilePath, String separator) {
101105
List<String[]> elements = new ArrayList<>();
102106

@@ -112,4 +116,14 @@ public static List<String[]> readCsvFile(String csvFilePath, String separator)
112116
return elements;
113117
}
114118

119+
public static boolean isParsableToInt(String input){
120+
try{
121+
Integer.parseInt(input);
122+
return true;
123+
}catch(NumberFormatException e){
124+
logger.log(Level.INFO, "One of the columns is a int. We will add to it a 'node' prefix.");
125+
return false;
126+
}
127+
}
128+
115129
}

0 commit comments

Comments
 (0)