/** * 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.apps.admin.service; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.axelor.meta.MetaFiles; import com.axelor.meta.db.MetaFile; import com.google.common.base.Strings; import com.google.inject.Inject; public class AsciiDocExportService { private int docIndex = 12; private int titleIndex = 5; private int menuIndex = 9; private Map<String, String> menuMap = new HashMap<String, String>(); private boolean hasMenu = false; private boolean firstRow = false; private List<String> processedMenu = new ArrayList<String>(); @Inject private ViewDocExportService viewDocExportService = new ViewDocExportService(); @Inject private MetaFiles metaFiles; public MetaFile export(MetaFile metaFile, String lang) throws IOException{ if(metaFile == null){ return null; } File excelFile = MetaFiles.getPath(metaFile).toFile(); if(excelFile == null || !excelFile.exists()){ return null; } File exportFile = export(excelFile, null, lang); return metaFiles.upload(exportFile); } public File export(File excelFile, File asciiDoc, String lang){ if(excelFile == null){ return null; } if(lang != null && lang.equals("fr")){ docIndex = 11; titleIndex = 6; menuIndex = 10; } try { FileInputStream inStream = new FileInputStream(excelFile); XSSFWorkbook workbook = new XSSFWorkbook(inStream); if(asciiDoc == null){ asciiDoc = File.createTempFile(excelFile.getName().replace(".xlsx", ""), ".txt"); } FileWriter fw = new FileWriter(asciiDoc); fw.write("= Documentation\n:toc:"); processSheet(workbook.iterator(), fw); fw.close(); return asciiDoc; } catch (IOException e) { e.printStackTrace(); } return null; } private void processSheet(Iterator<XSSFSheet> iterator, FileWriter fw) throws IOException { if(!iterator.hasNext()){ return; } XSSFSheet sheet = iterator.next(); // fw.write("\n\n== " + sheet.getSheetName()); hasMenu = false; processRow(sheet.rowIterator(), fw); processSheet(iterator, fw); } private void processRow(Iterator<Row> rowIterator, FileWriter fw) throws IOException{ if(!rowIterator.hasNext()){ return; } Row row = rowIterator.next(); String type = ViewDocExportService.getCellValue(row.getCell(3)); if(type != null){ String menu = ViewDocExportService.getCellValue(row.getCell(menuIndex)); if(type.equals("MENU")){ String doc = ViewDocExportService.getCellValue(row.getCell(docIndex)); if(menu != null && doc != null){ menuMap.put(menu, doc); } } else if(!Strings.isNullOrEmpty(menu) && type.equals("general") && !menu.contains("-form(")){ menu = processMenu(menu, fw); } else{ menu = null; } if(hasMenu){ processView(row, type, menu, fw); } } processRow(rowIterator, fw); } private String processMenu(String menu, FileWriter fw) throws IOException{ hasMenu = true; String[] menus = menu.split("/", 4); int count = -1; String checkMenu = ""; for(String mn : menus){ count++; checkMenu += mn + "/"; if(!processedMenu.contains(checkMenu)){ fw.write("\n\n==" + StringUtils.repeat("=", count) + " " + mn); processedMenu.add(checkMenu); } } if(menuMap.containsKey(menu)){ fw.write("\n" + menuMap.get(menu)); } return menus[menus.length-1]; } private void processView(Row row, String type, String menu, FileWriter fw) throws IOException{ String modelVal = ViewDocExportService.getCellValue(row.getCell(1)); String viewVal = ViewDocExportService.getCellValue(row.getCell(2)); if(Strings.isNullOrEmpty(modelVal) || Strings.isNullOrEmpty(viewVal)){ return; } String doc = ViewDocExportService.getCellValue(row.getCell(docIndex)); if(menu != null && !processedMenu.contains(menu)){ processedMenu.add(menu); fw.write("\nimage::" + viewVal + ".png[" + menu + ", align=\"center\"]"); if(type.equals("general") && !Strings.isNullOrEmpty(doc)){ fw.write("\n" + doc); } firstRow = true; return; } if(Strings.isNullOrEmpty(doc)){ return; } String title = ViewDocExportService.getCellValue(row.getCell(titleIndex)); if(Strings.isNullOrEmpty(title)){ title = ViewDocExportService.getCellValue(row.getCell(4)); } if(Strings.isNullOrEmpty(title)){ title = type.replace("tip", "TIP"); title = type.replace("general", "CAUTION"); title = title.replace("warn", "WARNING"); type = title; } if(type.contains("(")){ type = type.substring(0, type.indexOf("(")).replace("-", "_"); } if(viewDocExportService.fieldTypes.contains(type) || firstRow){ if(firstRow){ fw.write("\n\n[horizontal]"); } firstRow = false; fw.write("\n" + title + ":: "+ doc); } else{ fw.write("\n" + title + ": "+ doc + " +"); } } }