Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.00 KB | None | 0 0
  1. package xmlTest;
  2.  
  3.  
  4. import java.io.File;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.FileReader;
  8. import java.io.FileWriter;
  9. import java.util.ArrayList;
  10. import java.util.LinkedHashMap;
  11. import java.util.List;
  12. import java.util.Map;
  13.  
  14. import javax.xml.stream.XMLEventReader;
  15. import javax.xml.stream.XMLInputFactory;
  16. import javax.xml.stream.XMLOutputFactory;
  17. import javax.xml.stream.XMLStreamConstants;
  18. import javax.xml.stream.XMLStreamWriter;
  19. import javax.xml.stream.events.Characters;
  20. import javax.xml.stream.events.XMLEvent;
  21.  
  22. import org.jdom2.Element;
  23. import org.jdom2.input.SAXBuilder;
  24. import org.jdom2.output.Format;
  25. import org.jdom2.output.XMLOutputter;
  26.  
  27.  
  28. public class XMLWriter implements BackEndWriter {
  29.  
  30. private org.jdom2.Document document;
  31. private XMLEventReader eventReader;
  32. private XMLOutputFactory fileWriter;
  33. private XMLInputFactory inputFactory;
  34. private SAXBuilder saxBuilder;
  35. private FileOutputStream writer;
  36. private XMLOutputter xmlOutput;
  37. private XMLStreamWriter xmlStreamWriter;
  38.  
  39. public XMLWriter() {
  40. fileWriter = XMLOutputFactory.newInstance();
  41. saxBuilder = new SAXBuilder();
  42. xmlOutput = new XMLOutputter();
  43. xmlOutput.setFormat(Format.getPrettyFormat());
  44. inputFactory = XMLInputFactory.newInstance();
  45. }
  46.  
  47. @Override
  48. public SelectionTable readTable(Table table) throws FileNotFoundException {
  49. List<Object> values = new ArrayList<>();
  50. Map<String, Class<?>> names = getColumnsNames(table);
  51. SelectionTable selectionTable = new SelectionTable(table.getTableName(), names);
  52. File tableXML = table.getData();
  53. try {
  54. eventReader = inputFactory.createXMLEventReader(new FileReader(tableXML));
  55. document = saxBuilder.build(tableXML);
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. }
  59. while (eventReader.hasNext()) {
  60. XMLEvent event = null;
  61. try {
  62. event = eventReader.nextEvent();
  63. switch (event.getEventType()) {
  64. case XMLStreamConstants.START_ELEMENT:
  65. String startElementName = event.asStartElement().getName().getLocalPart();
  66. if (!(startElementName.equals("Record")
  67. || startElementName.equals(table.getTableName()))) {
  68. Characters chars = null;
  69. chars = (Characters) eventReader.nextEvent();
  70. if (chars.getData() == "null")
  71. values.add(null);
  72. else
  73. values.add(chars.getData());
  74. eventReader.nextEvent();
  75. } else {
  76. values = new ArrayList<>();
  77. }
  78. break;
  79. case XMLStreamConstants.END_ELEMENT:
  80. String endElementName = event.asEndElement().getName().getLocalPart();
  81. if (endElementName.equals("Record")) {
  82. Record tempRecord = new Record(names, values);
  83. selectionTable.addRecord(tempRecord);
  84. }
  85. }
  86. } catch (Exception e) {
  87. e.printStackTrace();
  88. }
  89. }
  90. return selectionTable;
  91. }
  92.  
  93. @Override
  94. public void writeTable(SelectionTable selectionTable) throws FileNotFoundException {
  95. try {
  96. File tableXML = selectionTable.getTableSchema().getData();
  97. eventReader = inputFactory.createXMLEventReader(new FileReader(tableXML));
  98. writer = new FileOutputStream(tableXML);
  99. xmlStreamWriter = fileWriter.createXMLStreamWriter(writer, "UTF-8");
  100. xmlStreamWriter.writeStartElement(selectionTable.getTableName());
  101. xmlStreamWriter.writeAttribute("colNames", mapToString(selectionTable.getHeader()));
  102. xmlStreamWriter.writeAttribute("types", classToString(selectionTable.getHeader()));
  103. xmlStreamWriter.writeEndElement();
  104. document = saxBuilder.build(tableXML);
  105. document.getRootElement().removeChildren("Record");
  106. for (int i = 0; i < selectionTable.getRecordList().size(); i++) {
  107. Record tempRecord = selectionTable.getRecordList().get(i);
  108. Element newRecord = new Element("Record");
  109. int counter = 0;
  110. for (String name : tempRecord.getColumns().keySet()) {
  111. Element tempElement;
  112. if (tempRecord.getValues().get(counter) == null)
  113. tempElement = new Element(name).setText("null");
  114. else
  115. tempElement = new Element(name)
  116. .setText(tempRecord.getValues().get(counter).toString());
  117. newRecord.addContent(tempElement);
  118. counter++;
  119. }
  120. document.getRootElement().addContent(newRecord);
  121. }
  122. xmlOutput.output(document, new FileWriter(tableXML));
  123. } catch (Exception e) {
  124. e.printStackTrace();
  125. throw new RuntimeException("Cannot insert into table");
  126. }
  127. }
  128.  
  129. @Override
  130. public File makeValidatorFile(String tablePath, String tableName,
  131. Map<String, Class<?>> header) {
  132. File dtdFile = new File(tablePath + File.separator + tableName + ".dtd");
  133. try {
  134. writer = new FileOutputStream(dtdFile);
  135. StringBuilder strBuilder = new StringBuilder();
  136. strBuilder.append("<!ELEMENT " + tableName + " (Record*)>\n");
  137. strBuilder.append("<!ELEMENT Record (");
  138. int counter = 0;
  139. for (String name : header.keySet()) {
  140. strBuilder.append(name);
  141. if (counter != header.size() - 1) {
  142. strBuilder.append(", ");
  143. }
  144. counter++;
  145. }
  146. strBuilder.append(")>\n");
  147. for (String name : header.keySet()) {
  148. strBuilder.append("<!ELEMENT " + name + " (#PCDATA)>\n");
  149. }
  150. strBuilder.append("<!ATTLIST " + tableName + " colNames CDATA #REQUIRED>\n");
  151. strBuilder.append("<!ATTLIST " + tableName + " types CDATA #REQUIRED>\n");
  152. System.out.println("here");
  153. writer.write(strBuilder.toString().getBytes());
  154. writer.flush();
  155. writer.close();
  156. } catch (Exception e) {
  157. throw new RuntimeException("Cannot generate dtd file.");
  158. }
  159. return dtdFile;
  160. }
  161.  
  162. @Override
  163. public File makeDataFile(String tablePath, String tableName, Map<String, Class<?>> header) {
  164. File xmlFile = new File(tablePath + File.separator + tableName + ".xml");
  165. try {
  166. writer = new FileOutputStream(xmlFile);
  167. xmlStreamWriter = fileWriter.createXMLStreamWriter(writer, "UTF-8");
  168. xmlStreamWriter.writeStartDocument("UTF-8", "1.0");
  169. xmlStreamWriter.writeCharacters("\n");
  170. xmlStreamWriter.writeEndDocument();
  171. xmlStreamWriter.flush();
  172. xmlStreamWriter.close();
  173. } catch (Exception e) {
  174. e.printStackTrace();
  175. }
  176. return xmlFile;
  177. }
  178.  
  179. private Map<String, Class<?>> getColumnsNames(Table table) {
  180. File tableXML = table.getData();
  181. Map<String, Class<?>> ret = new LinkedHashMap<>();
  182. try {
  183. eventReader = inputFactory.createXMLEventReader(new FileReader(tableXML));
  184. document = saxBuilder.build(tableXML);
  185. Element root = document.getRootElement();
  186. String names = root.getAttributeValue("colNames");
  187. String[] namesArr = names.split(",\\s");
  188. String types = root.getAttributeValue("types");
  189. String[] typesArr = types.split(",\\s");
  190. for (int i = 0; i < namesArr.length; i++) {
  191. ret.put(namesArr[i], ClassFactory.getClass(typesArr[i]));
  192. }
  193. } catch (Exception e) {
  194. e.printStackTrace();
  195. }
  196. return ret;
  197. }
  198.  
  199. private String mapToString(Map<String, Class<?>> map) {
  200.  
  201. StringBuilder strBuilder = new StringBuilder();
  202. int counter = 0;
  203. for (String name : map.keySet()) {
  204. strBuilder.append(name);
  205. if(counter != map.size()-1)
  206. strBuilder.append(", ");
  207. counter++;
  208. }
  209. return strBuilder.toString();
  210. }
  211.  
  212. private String classToString(Map<String, Class<?>> map) {
  213. StringBuilder strBuilder = new StringBuilder();
  214. int counter = 0;
  215. for (String name : map.keySet()) {
  216. strBuilder.append(map.get(name).getName());
  217. if(counter != map.size()-1)
  218. strBuilder.append(", ");
  219. counter++;
  220. }
  221. return strBuilder.toString();
  222. }
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement