com.tyndalehouse.step.tools.modules.ConvertXmlToOSISModule.java Source code

Java tutorial

Introduction

Here is the source code for com.tyndalehouse.step.tools.modules.ConvertXmlToOSISModule.java

Source

package com.tyndalehouse.step.tools.modules;

import com.tyndalehouse.step.core.utils.IOUtils;
import org.apache.commons.io.FileUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.xml.parsers.*;
import java.io.*;
import java.util.Properties;
import java.util.concurrent.*;

/**
 * @author chrisburrell
 */
public class ConvertXmlToOSISModule {
    private static final Logger LOGGER = LoggerFactory.getLogger(ConvertXmlToOSISModule.class);
    private static File SOURCE_DIRECTORY = new File("c:\\dev\\projects\\ebible\\downloads");
    private static File BASE_ERRORS = new File("c:\\dev\\projects\\ebible\\output\\errors\\");
    private static File BASE_OUTPUT = new File("c:\\dev\\projects\\ebible\\output\\modules\\texts\\ztext\\");
    private static File BASE_CONF = new File("c:\\dev\\projects\\ebible\\output\\mods.d");
    private static VelocityEngine ENGINE;

    static {
        Properties p = new java.util.Properties();
        p.setProperty("resource.loader", "class");
        p.setProperty("class.resource.loader.class",
                "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");

        ENGINE = new VelocityEngine();
        ENGINE.init(p);
    }

    private void convert() throws Exception {
        final BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(1024);
        final ExecutorService executorService = new ThreadPoolExecutor(3, 3, 1, TimeUnit.DAYS, queue);

        final File[] files = SOURCE_DIRECTORY.listFiles();
        for (final File f : files) {
            if (f.isDirectory()) {
                final File[] unzippedFiles = f.listFiles();
                for (final File unzipped : unzippedFiles) {
                    if (unzipped.getName().endsWith(".xml")) {
                        executorService.submit(new Runnable() {
                            @Override
                            public void run() {
                                try {
                                    convertToXml(f.getName(), unzipped);
                                    LOGGER.debug("Finished [{}], [{}] remaining", f.getName(), queue.size());
                                } catch (Exception e) {
                                    LOGGER.error("Failed to convert [{}]", f.getName(), e);
                                }
                            }
                        });
                        break;
                    }
                }
                //                break;
            }
        }
        executorService.shutdown();
    }

    private void convertToXml(final String moduleName, final File osisSource) throws Exception {
        LOGGER.debug("Reading [{}]", moduleName);

        SAXParserFactory spf = SAXParserFactory.newInstance();
        final SAXParser saxParser = spf.newSAXParser();
        final ExtractHeaderInformationSax header = new ExtractHeaderInformationSax();
        saxParser.parse(osisSource, header);

        LOGGER.debug(
                "title:[{}], description:[{}], copyright:[{}], license:[{}], language:[{}], versification:[{}]",
                header.getTitle(), header.getDescription(), header.getCopyright(), header.getLicense(),
                header.getLanguage(), header.getVersification());

        String sanitizedModuleName = moduleName.replace("-", "").toLowerCase();

        File outputDirectory = new File(BASE_OUTPUT, sanitizedModuleName);
        outputDirectory.mkdirs();
        BASE_ERRORS.mkdirs();
        //        
        //        LOGGER.debug("Converting [{}] to OSIS Module", sanitizedModuleName);
        //        Process p = Runtime.getRuntime().exec(String.format("osis2mod %s %s -z -v %s", outputDirectory.getAbsolutePath(), osisSource.getAbsolutePath(), header.getVersification()));
        //        LOGGER.debug("Conversion of [{}] finished.", sanitizedModuleName);
        //        outputErrors(p, moduleName);
        //        p.waitFor();

        outputConfFile(header, sanitizedModuleName, FileUtils.sizeOfDirectory(outputDirectory));

    }

    private void outputConfFile(final ExtractHeaderInformationSax header, String sanitizedModuleName, long bytes)
            throws IOException {

        final Template template = ENGINE.getTemplate("conf.vm");
        VelocityContext context = new VelocityContext();
        context.put("upperInitials", sanitizedModuleName.toUpperCase());
        context.put("lowerInitials", sanitizedModuleName.toLowerCase());
        context.put("title", header.getTitle());
        context.put("copyright", header.getCopyright());
        context.put("description", header.getDescription());
        context.put("language", header.getLanguage());
        context.put("license", getLicense(header.getLicense()));
        context.put("licenseText", header.getLicense());
        context.put("versification", header.getVersification());
        context.put("about", header.getAbout());
        context.put("installSize", bytes);
        context.put("xref", header.isHasCrossRefs());
        context.put("footnotes", header.isHasFootNotes());
        context.put("headings", header.isHasHeadings());
        context.put("morphology", header.isHasMorphology());
        context.put("redletters", header.isHasRedLetter());
        context.put("strongs", header.isHasStrongs());

        FileWriter fw = new FileWriter(new File(BASE_CONF, sanitizedModuleName + ".conf"));
        template.merge(context, fw);
        IOUtils.closeQuietly(fw);
    }

    private String getLicense(final String license) {
        if (license.contains("by-nc-nd")) {
            return "Creative Commons: by-nc-nd";
        } else if (license.contains("by-nc-sa")) {
            return "Creative Commons: by-nc-sa";
        } else if (license.contains("by-nc")) {
            return "Creative Commons: by-nc";
        } else if (license.contains("by-nd")) {
            return "Creative Commons: by-nd";
        } else if (license.contains("by-sa")) {
            return "Creative Commons: by-sa";
        } else if (license.contains("CC0")) {
            return "Creative Commons: CC0";
        } else if (license.contains("Public Domain")) {
            return "Public Domain";
        }
        LOGGER.error("Unknown license: [{}]", license);
        return "Unknown";
    }

    private void outputErrors(final Process p, final String moduleName) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        StringBuilder content = new StringBuilder(256);
        String line;
        while ((line = in.readLine()) != null) {
            content.append(line);
            content.append("\r\n");
        }
        FileUtils.writeStringToFile(new File(BASE_ERRORS, moduleName + ".log"), content.toString());
        in.close();
    }

    /**
     * @param args the SOURCE_DIRECTORY containing all the modules
     */
    public static void main(String[] args) throws Exception {
        new ConvertXmlToOSISModule().convert();
    }

}