Advertisement
Guest User

Untitled

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