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 getXMLColumn(Document document) { String section = null; String control = null; document.getDocumentElement().normalize(); NodeList nodeList = document.getElementsByTagName("control"); List elementXML = new ArrayList(); 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 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 xmlColumn) { List 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()); } } }