Skip to content

Commit

Permalink
Merge pull request #12 from 2023-2-Design-Pattern/hyh/XMLImpoter
Browse files Browse the repository at this point in the history
feat: XMLImporter
  • Loading branch information
hnnynh authored Nov 17, 2023
2 parents 1096110 + 91e6320 commit d155679
Showing 39 changed files with 173 additions and 26 deletions.
Binary file modified bin/com/holub/database/ConcreteTable$Results.class
Binary file not shown.
Binary file modified bin/com/holub/database/ConcreteTable$Test$1.class
Binary file not shown.
Binary file modified bin/com/holub/database/ConcreteTable$Test$2.class
Binary file not shown.
Binary file modified bin/com/holub/database/ConcreteTable$Test$3.class
Binary file not shown.
Binary file modified bin/com/holub/database/ConcreteTable$Test$4.class
Binary file not shown.
Binary file modified bin/com/holub/database/ConcreteTable$Test$5.class
Binary file not shown.
Binary file modified bin/com/holub/database/ConcreteTable$Test$6.class
Binary file not shown.
Binary file modified bin/com/holub/database/ConcreteTable$Test$7.class
Binary file not shown.
Binary file modified bin/com/holub/database/ConcreteTable$Test.class
Binary file not shown.
Binary file modified bin/com/holub/database/ConcreteTable$UndoDelete.class
Binary file not shown.
Binary file modified bin/com/holub/database/ConcreteTable$UndoInsert.class
Binary file not shown.
Binary file modified bin/com/holub/database/ConcreteTable$UndoUpdate.class
Binary file not shown.
Binary file modified bin/com/holub/database/ConcreteTable.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$1.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$2.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$3.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$ArithmeticExpression.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$AtomicExpression.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$BooleanValue.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$IdValue.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$LikeExpression.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$LogicalExpression.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$MathOperator.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$NotExpression.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$NullValue.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$NumericValue.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$RelationalExpression.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$RelationalOperator.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$StringValue.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database$Test.class
Binary file not shown.
Binary file modified bin/com/holub/database/Database.class
Binary file not shown.
Binary file modified bin/com/holub/database/Table.class
Binary file not shown.
Binary file modified bin/com/holub/database/UnmodifiableTable.class
Binary file not shown.
2 changes: 1 addition & 1 deletion src/com/holub/database/CSVImporter.java
Original file line number Diff line number Diff line change
@@ -102,4 +102,4 @@ public Iterator loadRow() throws IOException
}

public void endTable() throws IOException {}
}
}
32 changes: 16 additions & 16 deletions src/com/holub/database/HTMLExporter.java
Original file line number Diff line number Diff line change
@@ -11,46 +11,46 @@ public HTMLExporter(Writer out) {
}

public void startTable() throws IOException {
out.write("<html>");
out.write("<body>");
out.write("<html>\n");
out.write("<body>\n");
}

public void storeMetadata(String tableName, int width, int height, Iterator columnNames) throws IOException {
out.write("<table>");
out.write("<table>\n");
out.write("<caption>");
out.write(tableName == null ? "anonymous" : tableName); // title of the table
out.write("</caption>");

out.write("<thead>");
out.write("<tr>");
out.write("<thead>\n");
out.write("<tr>\n");

while(columnNames.hasNext()) {
out.write("<th scope=\"col\">");
out.write(columnNames.next().toString());
out.write("</th>");
out.write("</th>\n");
}

out.write("</tr>");
out.write("</thead>");
out.write("<tbody>");
out.write("</tr>\n");
out.write("</thead>\n");
out.write("<tbody>\n");
}

public void storeRow(Iterator data) throws IOException {
out.write("<tr>");
out.write("<tr>\n");
while(data.hasNext()) {
out.write("<td>");
out.write(data.next().toString());
out.write("</td>");
out.write("</td>\n");
}
out.write("</tr>");
out.write("</tr>\n");
}


public void endTable() throws IOException {
out.write("</tbody>");
out.write("</table>");
out.write("</body>");
out.write("</html>");
out.write("</tbody>\n");
out.write("</table>\n");
out.write("</body>\n");
out.write("</html>\n");

out.close();
}
16 changes: 8 additions & 8 deletions src/com/holub/database/XMLExporter.java
Original file line number Diff line number Diff line change
@@ -13,7 +13,7 @@ public XMLExporter(Writer out) {
}

public void startTable() throws IOException {
out.write("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>");
out.write("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n");
}

public void storeMetadata(String tableName, int width, int height, Iterator columnNames) throws IOException {
@@ -23,21 +23,21 @@ public void storeMetadata(String tableName, int width, int height, Iterator colu
while(columnNames.hasNext()) {
this.columnNames[idx++] = columnNames.next().toString();
}
out.write(tableName == null ? "<anonymous>" : "<" + tableName + ">" );
out.write(tableName == null ? "<anonymous>\n" : "<" + tableName + ">\n" );
}

public void storeRow(Iterator data) throws IOException {
out.write("<data>");
out.write("<data>\n");
int idx = 0;
while(data.hasNext()) {
out.write("<" + columnNames[idx] + ">");
out.write(data.next().toString());
out.write("</" + columnNames[idx++] + ">");
out.write("<" + columnNames[idx] + ">\n");
out.write(data.next().toString()+"\n");
out.write("</" + columnNames[idx++] + ">\n");
}
out.write("</data>");
out.write("</data>\n");
}

public void endTable() throws IOException {
out.write(tableName == null ? "</anonymous>" : "</" + tableName + ">" );
out.write(tableName == null ? "</anonymous>\n" : "</" + tableName + ">\n" );
}
}
2 changes: 1 addition & 1 deletion src/com/holub/database/XMLExporterTest.java
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@

public class XMLExporterTest {
@Test
public void HTML() throws IOException {
public void XML() throws IOException {
Table people = TableFactory.create("people", new String[] { "last", "first", "addrId" });
people.insert(new Object[] { "Holub", "Allen", "1" });
people.insert(new Object[] { "Flintstone", "Wilma", "2" });
94 changes: 94 additions & 0 deletions src/com/holub/database/XMLImporter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package com.holub.database;

import com.holub.tools.ArrayIterator;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class XMLImporter implements Table.Importer {
private BufferedReader in;
private String tableName;
private List<String> columnNames;

private Document xmlDoc;
private List<Node> rowList;
private int curIdx = 0;

public XMLImporter(File xmlFile) throws IOException, SAXException, ParserConfigurationException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
xmlDoc = builder.parse(xmlFile);
xmlDoc.getDocumentElement().normalize();
}

public XMLImporter(Reader in) throws IOException, SAXException, ParserConfigurationException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
xmlDoc = builder.parse(new InputSource(in));
xmlDoc.getDocumentElement().normalize();
}

public void startTable() throws IOException {
Element root = xmlDoc.getDocumentElement(); // root: <tableName>
tableName = root.getNodeName();
NodeList list = root.getChildNodes();
rowList = new ArrayList<>(); // <data> ... </data> List
for(int i = 0; i < list.getLength(); i++){
if (list.item(i).getNodeType() == Node.ELEMENT_NODE) {
rowList.add(list.item(i));
}
}

Node n = rowList.get(0); // <data> ... </data>
columnNames = new ArrayList<>();
list = n.getChildNodes();
for(int i = 0; i < list.getLength(); i++){
if (list.item(i).getNodeType() == Node.ELEMENT_NODE) {
columnNames.add(list.item(i).getNodeName());
}
}
}

public String loadTableName() throws IOException {
return tableName;
}

public int loadWidth() throws IOException {
return columnNames.size();
}

public Iterator loadColumnNames() throws IOException {
return columnNames.iterator();
}

public Iterator loadRow() throws IOException {
Iterator row = null;

if(curIdx < rowList.size()){
Node n = rowList.get(curIdx);
NodeList list = n.getChildNodes();
List<String> data = new ArrayList<>();
for(int i=0; i<list.getLength(); i++) {
if (list.item(i).getNodeType() == Node.ELEMENT_NODE) {
data.add(list.item(i).getTextContent().trim());
}
}
row = data.iterator();
curIdx++;
}
return row;
}

public void endTable() throws IOException { }
}
53 changes: 53 additions & 0 deletions src/com/holub/database/XMLImporterTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.holub.database;

import org.junit.Test;
import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import java.io.*;
import java.util.Iterator;

import static org.junit.Assert.assertEquals;

public class XMLImporterTest {
@Test
public void XML() throws IOException, ParserConfigurationException, SAXException {

Reader in = new FileReader("c:/dp2023/people.xml");
XMLImporter importer = new XMLImporter(in);
importer.startTable();

String tableName = importer.loadTableName();
assertEquals(tableName, "people");


int width = importer.loadWidth();
assertEquals(width, 3);

Iterator columns = importer.loadColumnNames();
String[] columnNames = new String[width];
for (int i = 0; columns.hasNext();){
columnNames[i++] = (String) columns.next();
}
assertEquals(columnNames[0], "last");
assertEquals(columnNames[1], "first");
assertEquals(columnNames[2], "addrId");

int idx = 0;
String[][] rowValues = new String[2][width];
while ((columns = importer.loadRow()) != null) {
for (int i = 0; columns.hasNext();)
rowValues[idx][i++] = (String) columns.next();
idx++;
}

assertEquals(rowValues[0][0], "Holub");
assertEquals(rowValues[0][1], "Allen");
assertEquals(rowValues[0][2], "1");
assertEquals(rowValues[1][0], "Flintstone");
assertEquals(rowValues[1][1], "Wilma");
assertEquals(rowValues[1][2], "2");

importer.endTable();
}
}

0 comments on commit d155679

Please sign in to comment.