/*
* Copyright 2015-Present Entando S.r.l. (http://www.entando.com) All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package org.entando.entando.aps.system.init.model;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.BeanComparator;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.agiletec.aps.util.DateConverter;
/**
* @author E.Santoboni
*/
public class DataSourceDumpReport {
private static final Logger _logger = LoggerFactory.getLogger(DataSourceDumpReport.class);
public DataSourceDumpReport(SystemInstallationReport installationReport) {
List<ComponentInstallationReport> componentInstallationReports = installationReport.getReports();
for (int i = 0; i < componentInstallationReports.size(); i++) {
ComponentInstallationReport component = componentInstallationReports.get(i);
this.addComponentHistory(component);
}
}
public DataSourceDumpReport(String xmlText) {
if (null == xmlText || xmlText.trim().length() == 0) {
return;
}
SAXBuilder builder = new SAXBuilder();
builder.setValidation(false);
StringReader reader = new StringReader(xmlText);
try {
Document doc = builder.build(reader);
Element rootElement = doc.getRootElement();
Element dateElement = rootElement.getChild(DATE_ELEMENT);
if (null != dateElement) {
Date date = DateConverter.parseDate(dateElement.getText(), DATE_FORMAT);
this.setDate(date);
}
Element subfolderElement = rootElement.getChild(SUBFOLDER_NAME_ELEMENT);
if (null != subfolderElement) {
this.setSubFolderName(subfolderElement.getText());
}
Element requiredTimeElement = rootElement.getChild(REQUIRED_TIME_ELEMENT);
if (null != requiredTimeElement) {
this.setRequiredTime(Long.valueOf(requiredTimeElement.getText()));
}
Element componentsElement = rootElement.getChild(COMPONENTS_HISTORY_ELEMENT);
if (null != componentsElement) {
List<Element> componentElements = componentsElement.getChildren();
for (int i = 0; i < componentElements.size(); i++) {
Element componentElement = componentElements.get(i);
ComponentInstallationReport componentHistory = new ComponentInstallationReport(componentElement);
this.addComponentHistory(componentHistory);
}
}
List<Element> elements = rootElement.getChildren(DATASOURCE_ELEMENT);
for (int i = 0; i < elements.size(); i++) {
Element dataSourceElement = elements.get(i);
String dataSourceName = dataSourceElement.getAttributeValue(NAME_ATTRIBUTE);
List<Element> tableElements = dataSourceElement.getChildren();
for (int j = 0; j < tableElements.size(); j++) {
Element tableElement = tableElements.get(j);
TableDumpReport tableDumpReport = new TableDumpReport(tableElement);
this.addTableReport(dataSourceName, tableDumpReport);
}
}
} catch (Throwable t) {
_logger.error("Error parsing Report. xml:{} ", xmlText, t);
throw new RuntimeException("Error detected while parsing the XML", t);
}
}
public String toXml() {
try {
Document doc = new Document();
Element rootElement = new Element(ROOT_ELEMENT);
this.addElement(DATE_ELEMENT, DateConverter.getFormattedDate(this.getDate(), DATE_FORMAT), rootElement);
this.addElement(REQUIRED_TIME_ELEMENT, String.valueOf(this.getRequiredTime()), rootElement);
this.addElement(SUBFOLDER_NAME_ELEMENT, this.getSubFolderName(), rootElement);
Element components = new Element(COMPONENTS_HISTORY_ELEMENT);
rootElement.addContent(components);
List<ComponentInstallationReport> componentsHistory = this.getComponentsHistory();
for (int i = 0; i < componentsHistory.size(); i++) {
ComponentInstallationReport componentHistory = componentsHistory.get(i);
Element element = componentHistory.toJdomElement();
components.addContent(element);
}
List<String> dataSourceNames = new ArrayList<String>();
dataSourceNames.addAll(this.getDataSourcesReports().keySet());
for (int i = 0; i < dataSourceNames.size(); i++) {
String dataSourceName = dataSourceNames.get(i);
Element dataSourceElement = new Element(DATASOURCE_ELEMENT);
rootElement.addContent(dataSourceElement);
dataSourceElement.setAttribute(NAME_ATTRIBUTE, dataSourceName);
List<TableDumpReport> tableReports = this.getDataSourcesReports().get(dataSourceName);
BeanComparator comparator = new BeanComparator("tableName");
Collections.sort(tableReports, comparator);
for (int j = 0; j < tableReports.size(); j++) {
TableDumpReport tableDumpReport = tableReports.get(j);
dataSourceElement.addContent(tableDumpReport.toJdomElement());
}
}
doc.setRootElement(rootElement);
XMLOutputter out = new XMLOutputter();
Format format = Format.getPrettyFormat();
format.setIndent("\t");
out.setFormat(format);
return out.outputString(doc);
} catch (Throwable t) {
_logger.error("Error creating XML", t);
throw new RuntimeException("Error creating XML", t);
}
}
private void addElement(String name, String text, Element parent) {
Element element = new Element(name);
element.setText(text);
parent.addContent(element);
}
public Date getDate() {
return _date;
}
public void setDate(Date date) {
this._date = date;
}
public String getSubFolderName() {
return _subFolderName;
}
public void setSubFolderName(String subFolderName) {
this._subFolderName = subFolderName;
}
public void addTableReport(String dataSourceName, TableDumpReport tableDumpReport) {
List<TableDumpReport> dataSourceReports = this.getDataSourcesReports().get(dataSourceName);
if (null == dataSourceReports) {
dataSourceReports = new ArrayList<TableDumpReport>();
this.getDataSourcesReports().put(dataSourceName, dataSourceReports);
}
dataSourceReports.add(tableDumpReport);
}
public List<String> getDataSourceNames() {
List<String> list = new ArrayList<String>();
if (null != this.getDataSourcesReports()) {
list.addAll(this.getDataSourcesReports().keySet());
}
Collections.sort(list);
return list;
}
public Map<String, List<TableDumpReport>> getDataSourcesReports() {
return _dataSourcesReports;
}
public void setDataSourcesReports(Map<String, List<TableDumpReport>> dataSourcesReports) {
this._dataSourcesReports = dataSourcesReports;
}
protected void addComponentHistory(ComponentInstallationReport component) {
this._componentsHistory.add(component);
}
public List<ComponentInstallationReport> getComponentsHistory() {
BeanComparator comparator = new BeanComparator("date");
Collections.sort(this._componentsHistory, comparator);
return _componentsHistory;
}
public void setComponentsHistory(List<ComponentInstallationReport> componentsHistory) {
this._componentsHistory = componentsHistory;
}
public long getRequiredTime() {
return _requiredTime;
}
public void setRequiredTime(long requiredTime) {
this._requiredTime = requiredTime;
}
private Date _date;
private String _subFolderName;
private Map<String, List<TableDumpReport>> _dataSourcesReports = new HashMap<String, List<TableDumpReport>>();
private List<ComponentInstallationReport> _componentsHistory = new ArrayList<ComponentInstallationReport>();
private long _requiredTime;
private static final String ROOT_ELEMENT = "backup";
private static final String DATE_ELEMENT = "date";
private static final String SUBFOLDER_NAME_ELEMENT = "subfolder";
private static final String REQUIRED_TIME_ELEMENT = "requiredTime";
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
private static final String DATASOURCE_ELEMENT = "datasource";
private static final String NAME_ATTRIBUTE = "name";
private static final String COMPONENTS_HISTORY_ELEMENT = "componentsHistory";
}