116 lines
4.1 KiB
Java
116 lines
4.1 KiB
Java
package hycom.dao;
|
|
|
|
import hycom.service.TableNameParser;
|
|
import hycom.service.XMLSerialize;
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import javax.xml.parsers.ParserConfigurationException;
|
|
import org.springframework.stereotype.Component;
|
|
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;
|
|
|
|
/**
|
|
* Klasa mapująca formularz na XML oraz obsługująca zapytania do bazy danych
|
|
*/
|
|
|
|
@Component
|
|
public class MapperPublishDao extends BaseMapperDao {
|
|
|
|
private StringBuilder sqlTableCreate = new StringBuilder();
|
|
|
|
/**
|
|
* Parsuje formularz z String na XML.
|
|
* @param stringXML pusty formularz przychodzący w formie String
|
|
* @param appName nazwa Aplikacji formularza
|
|
* @param formName nazwa Formy forumlarza
|
|
* @throws ParserConfigurationException Wyjątek wyrzucany, w przypadku próby parsowania nie odpowiedniego pliku.
|
|
* @throws IOException Wyjątek wyrzucany, w przypadku odczytywania z zamkniętego strumienia danych.
|
|
* @throws SAXException Wyjątek wyrzucany, w przypadku nieudanego budowania pliku dokumentu.
|
|
*/
|
|
|
|
public void parseStringToXML(String stringXML, String appName, String formName)
|
|
throws ParserConfigurationException, IOException, SAXException {
|
|
Document document = XMLSerialize.parseStringToXML(stringXML);
|
|
sqlTableCreate.setLength(0);
|
|
String tableName = TableNameParser.convertTableName(appName, formName);
|
|
if (!checkTable(tableName)) {
|
|
createTable(tableName);
|
|
createColumn(document);
|
|
} else {
|
|
updateTable(tableName, getXMLColumn(document));
|
|
}
|
|
}
|
|
|
|
private void createTable(String tableName) {
|
|
sqlTableCreate.setLength(0);
|
|
sqlTableCreate
|
|
.append("CREATE TABLE " + tableName);
|
|
}
|
|
|
|
private List<String> getXMLColumn(Document document) {
|
|
String section = null;
|
|
String control = null;
|
|
document.getDocumentElement().normalize();
|
|
NodeList nodeList = document.getElementsByTagName("control");
|
|
List<String> elementXML = new ArrayList<String>();
|
|
for (int i = 0; i < nodeList.getLength(); i++) {
|
|
Node node = nodeList.item(i);
|
|
Element element = (Element) node;
|
|
if (element.getAttribute("name").contains("section"))
|
|
section = element.getAttribute("name").replace("-","_");
|
|
control = element.getAttribute("name").replace("-","_");
|
|
if (!element.getAttribute("name").contains("section"))
|
|
elementXML.add(section + "_" + control);
|
|
}
|
|
return elementXML;
|
|
}
|
|
|
|
private void createColumn(Document document) {
|
|
List<String> columnXML = getXMLColumn(document);
|
|
sqlTableCreate.append("\n( \n");
|
|
sqlTableCreate.append("ID BIGSERIAL PRIMARY KEY, \n");
|
|
sqlTableCreate.append("SEND_DATA TIMESTAMP NOT NULL, \n");
|
|
sqlTableCreate.append("LOGIN TEXT NOT NULL, \n");
|
|
Iterator iterator = columnXML.iterator();
|
|
while (iterator.hasNext()) {
|
|
sqlTableCreate.append(" " + iterator.next() + " TEXT, \n");
|
|
}
|
|
sqlTableCreate.deleteCharAt(sqlTableCreate.length() - 3);
|
|
sqlTableCreate.append(")\n");
|
|
jdbcTemplate.update(sqlTableCreate.toString());
|
|
}
|
|
|
|
private boolean checkTable(String tableName) {
|
|
|
|
StringBuilder sqlCheckTable = new StringBuilder();
|
|
sqlCheckTable
|
|
.append("SELECT COUNT(*) FROM information_schema.tables " +
|
|
"WHERE table_schema='public' AND table_name = '" + tableName + "'");
|
|
int exist = jdbcTemplate.queryForObject(sqlCheckTable.toString(), Integer.class);
|
|
if (exist > 0)
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
private void updateTable(String tableName, List<String> xmlColumn) {
|
|
List<String> columnList = jdbcTemplate.queryForList(
|
|
("SELECT column_name FROM information_schema.columns where table_name = '" + tableName + "'"),String.class);
|
|
xmlColumn.removeAll(columnList);
|
|
if (!xmlColumn.isEmpty()) {
|
|
StringBuilder sqlAddColumns = new StringBuilder();
|
|
sqlAddColumns.append("ALTER TABLE " + tableName + "\n");
|
|
Iterator iterator = xmlColumn.iterator();
|
|
while (iterator.hasNext()) {
|
|
sqlAddColumns.append("ADD COLUMN " + iterator.next() + " TEXT, \n");
|
|
}
|
|
sqlAddColumns.deleteCharAt(sqlAddColumns.length() - 3).append(";");
|
|
jdbcTemplate.update(sqlAddColumns.toString());
|
|
}
|
|
}
|
|
} |