/**
* Axelor Business Solutions
*
* Copyright (C) 2016 Axelor (<http://axelor.com>).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.axelor.csv.script;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import com.axelor.apps.tool.file.CsvTool;
import com.google.common.base.CaseFormat;
/**
* Class generate import compatible csv files from xml model files.
* @author axelor
*
*/
public class PrepareCsv {
private static final Logger LOG = LoggerFactory.getLogger(PrepareCsv.class);
/**
* Method to generate csv files
* @param xmlDir
* @param csvDir
*/
public void prepareCsv(String xmlDir, String csvDir){
List<String> ignoreType = Arrays.asList("one-to-one","many-to-many","one-to-many");
try{
if(xmlDir != null && csvDir != null){
File xDir = new File(xmlDir);
File cDir = new File(csvDir);
List<String[]> blankData = new ArrayList<String[]>();
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
if(xDir.isDirectory() && cDir.isDirectory()){
for(File xf : xDir.listFiles()){
LOG.info("Processing XML: "+xf.getName());
List<String> fieldList = new ArrayList<String>();
Document doc = dBuilder.parse(xf);
NodeList nList = doc.getElementsByTagName("module");
String module = nList.item(0).getAttributes().getNamedItem("name").getNodeValue();
nList = doc.getElementsByTagName("entity");
if(nList != null){
NodeList fields = nList.item(0).getChildNodes();
Integer count = 0;
String csvFileName = module+"_"+CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, xf.getName().replace(".xml", ".csv"));
while(count < fields.getLength()){
Node field = fields.item(count);
NamedNodeMap attrs = field.getAttributes();
String type = field.getNodeName();
if(attrs != null && attrs.getNamedItem("name") != null && !ignoreType.contains(type)){
String fieldName = attrs.getNamedItem("name").getNodeValue();
if(type.equals("many-to-one")){
String[] objName = attrs.getNamedItem("ref").getNodeValue().split("\\.");
String refName = objName[objName.length-1];
String nameColumn = getNameColumn(xmlDir+"/"+refName+".xml");
if(nameColumn != null)
fieldList.add(fieldName+"."+nameColumn);
else{
fieldList.add(fieldName);
LOG.error("No name column found for "+refName+", field '"+attrs.getNamedItem("name").getNodeValue()+"'");
}
}
else
fieldList.add(fieldName);
}
count++;
}
CsvTool.csvWriter(csvDir, csvFileName, ';',StringUtils.join(fieldList,",").split(","), blankData);
LOG.info("CSV file prepared: "+csvFileName);
}
}
}
else
LOG.error("XML and CSV paths must be directory");
}
else
LOG.error("Please input XML and CSV directory path");
}catch(Exception e){
e.printStackTrace();
}
}
/**
* Get namecolumn field of entity
* @param fileName
* @return
* @throws SAXException
* @throws IOException
* @throws ParserConfigurationException
*/
private String getNameColumn(String fileName) throws SAXException, IOException, ParserConfigurationException {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
File domainFile = new File(fileName);
if(!domainFile.exists())
return null;
Document doc = dBuilder.parse(domainFile);
NodeList nList = doc.getElementsByTagName("entity");
if(nList != null){
NodeList fields = nList.item(0).getChildNodes();
Integer count = 0;
while(count < fields.getLength()){
NamedNodeMap attrs = fields.item(count).getAttributes();
count++;
if(attrs != null && attrs.getNamedItem("name") != null){
String name = attrs.getNamedItem("name").getNodeValue();
if(name.equals("importId"))
return "importId";
else if(name.equals("code"))
return "code";
else if(name.equals("name"))
return "name";
else
continue;
}
}
}
return null;
}
}