orbeon-bluedb-integration/integration-module/src/main/java/hycom/dao/MapperPublishDao.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());
}
}
}