Java tutorial
/** * 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; } }