org.openehealth.ipf.labs.maven.dsldoc.Extractor.java Source code

Java tutorial

Introduction

Here is the source code for org.openehealth.ipf.labs.maven.dsldoc.Extractor.java

Source

/*
 * Copyright 2010 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.openehealth.ipf.labs.maven.dsldoc;

import groovy.lang.GroovyClassLoader;

import java.io.File;
import java.io.IOException;

import org.apache.maven.plugin.logging.Log;
import org.openehealth.ipf.labs.maven.dsldoc.descriptor.EclipseRenderer;
import org.openehealth.ipf.labs.maven.dsldoc.descriptor.HTMLRenderer;
import org.openehealth.ipf.labs.maven.dsldoc.descriptor.IDEARenderer;
import org.openehealth.ipf.labs.maven.dsldoc.domain.Documentation;
import org.openehealth.ipf.labs.maven.dsldoc.domain.Types;

import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaMethod;
import com.thoughtworks.qdox.model.JavaSource;

/**
 * Extracts DSL documentation in the three supported formats (GDSL, DSLD and
 * HTML). Extraction is performed by feeding the sources to QDox. Then the parts
 * of the documentation (methods and their parameters) related to DSL extensions
 * are extracted and grouped into modules and sections. Modules correspond to
 * the Maven modules/artifacts, sections correspond to classes. Finally, the
 * desired format is generated by the corresponding rednerers, that render a
 * {@link Documentation} object and the text is written into the output files.
 * 
 * @author Jens Riemschneider
 */
public class Extractor {

    private final Types types;
    private final HTMLRenderer html;
    private final EclipseRenderer eclipse;
    private final IDEARenderer idea;
    private final String csvDescriptorFileExtensions;

    /**
     * Constructs an Extractor instance.
     * 
     * @param types the type info object that contains api links.
     * @param descriptorFileExtensions
     */
    public Extractor(Types types, String descriptorFileExtensions) {
        this.types = types;
        this.csvDescriptorFileExtensions = descriptorFileExtensions;
        this.html = new HTMLRenderer();
        this.idea = new IDEARenderer();
        this.eclipse = new EclipseRenderer();
    }

    /**
     * Generates DSL descriptor files for the given module. The modules are per
     * extension class.
     * 
     * @param module
     *            the module to generate the GDSL files for.
     * @param outputDirectory
     *            the destination directory for the GDSL files.
     * @param sourceDir
     *            the source directories to be scanned for dsl extensions.
     * @param log
     *            the logger to use.
     * @throws IOException
     *             if reading or writing a file failed.
     */
    public void generateDSLDescriptors(String module, File outputDirectory, String[] sourceDir, Log log)
            throws IOException {
        Documentation doc = new Documentation(types);

        DslDocBuilder builder = addSources(sourceDir, log);
        builder.getClassLibrary().addClassLoader(new GroovyClassLoader());
        if (builder.getSources().length == 0) {
            log.info("No sources found.");
            return;
        }

        log.info("Processing sources");
        for (JavaSource src : builder.getSources()) {
            for (JavaClass cls : src.getClasses()) {
                if (null != cls.getTagByName(Documentation.DSL_TAG)) {
                    for (JavaMethod method : cls.getMethods()) {
                        doc.registerMethod(module, cls, method);
                    }
                    eclipse.writeToFile(doc, cls, outputDirectory, log);
                    idea.writeToFile(doc, cls, outputDirectory, log);
                }
            }
        }
    }

    /**
     * Generate a DSL HTML fragment for the given module. The fragmrents are merged on 
     * reporting phase by {@link DslIndexReport}
     * 
     * @param module
     *            the name of the module to generate the report for.
     * @param outputDirectory
     *            the directory that the DSL index is created in.
     * @param sourceDirs
     *            the source directories to be scanned for dsl extensions.
     * @param log
     *            the logger to use.
     * @throws IOException
     *             if reading or writing a file failed.
     */
    public void generateDSLHTMLFragment(String module, File outputDirectory, String[] sourceDirs, Log log)
            throws IOException {
        Documentation doc = new Documentation(types);
        DslDocBuilder builder = addSources(sourceDirs, log);
        if (builder.getSources().length == 0) {
            log.info("No sources found.");
            return;
        }

        log.info("Processing sources");
        for (JavaSource src : builder.getSources()) {
            for (JavaClass cls : src.getClasses()) {
                for (JavaMethod method : cls.getMethods()) {
                    doc.registerMethod(module, cls, method);
                }
            }
        }
        JavaClass DUMMY = new JavaClass();
        html.writeToFile(doc, DUMMY, outputDirectory, log);
    }

    private DslDocBuilder addSources(String[] files, Log log) {
        DslDocBuilder builder = new DslDocBuilder(csvDescriptorFileExtensions, log);
        for (String filename : files) {
            File file = new File(filename);
            if (file.exists()) {
                log.info("Adding source tree: " + filename);
                builder.addSourceTree(file);
            }
        }
        return builder;
    }
}