Package com.buschmais.jqassistant.scm.cli

Source Code of com.buschmais.jqassistant.scm.cli.ClassToNeo4JImporter

package com.buschmais.jqassistant.scm.cli;

import static com.buschmais.jqassistant.core.scanner.api.iterable.IterableConsumer.consume;
import static com.buschmais.jqassistant.plugin.java.api.scanner.JavaScope.CLASSPATH;
import static com.buschmais.jqassistant.scm.cli.Log.getLog;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;

import com.buschmais.jqassistant.core.plugin.api.PluginRepositoryException;
import com.buschmais.jqassistant.core.plugin.api.ScannerPluginRepository;
import com.buschmais.jqassistant.core.plugin.impl.ScannerPluginRepositoryImpl;
import com.buschmais.jqassistant.core.scanner.api.Scanner;
import com.buschmais.jqassistant.core.scanner.api.ScannerPlugin;
import com.buschmais.jqassistant.core.scanner.impl.ScannerImpl;
import com.buschmais.jqassistant.core.store.api.Store;
import com.buschmais.jqassistant.plugin.common.api.type.ArtifactDirectoryDescriptor;
import com.buschmais.jqassistant.plugin.java.api.scanner.ClassesDirectory;

/**
* @author jn4, Kontext E GmbH, 23.01.14
*/
public class ClassToNeo4JImporter extends CommonJqAssistantTask implements OptionsConsumer {
    private final List<String> directoryNames = new ArrayList<>();

    public ClassToNeo4JImporter() {
        super("scan");
    }

    protected void doTheTask(final Store store) {
        store.reset();
        try {
            for (String directoryName : directoryNames) {
                properties = new HashMap<>();
                scanDirectory(store, directoryName, getScannerPluginRepository(store, properties).getScannerPlugins());
            }
        } catch (PluginRepositoryException e) {
            throw new RuntimeException(e);
        }
    }

    protected ScannerPluginRepository getScannerPluginRepository(Store store, Map<String, Object> properties) {
        try {
            return new ScannerPluginRepositoryImpl(pluginConfigurationReader, store, properties);
        } catch (PluginRepositoryException e) {
            throw new RuntimeException("Cannot create rule plugin repository.", e);
        }
    }

    private void scanDirectory(Store store, final String directoryName, final List<ScannerPlugin<?>> scannerPlugins) {
        final File directory = new File(directoryName);
        if (!directory.exists()) {
            getLog().info("Directory '" + directory.getAbsolutePath() + "' does not exist, skipping scan.");
        } else {
            store.beginTransaction();
            try {
                final ArtifactDirectoryDescriptor artifactDescriptor = getOrCreateArtifactDescriptor(store);
                final Scanner scanner = new ScannerImpl(scannerPlugins);
                try {
                    consume(scanner.scan(new ClassesDirectory(directory, artifactDescriptor), CLASSPATH));
                } catch (IOException e) {
                    throw new RuntimeException("Cannot scan directory '" + directory.getAbsolutePath() + "'", e);
                }
            } finally {
                store.commitTransaction();
            }
        }
    }

    private ArtifactDirectoryDescriptor getOrCreateArtifactDescriptor(final Store store) {
        final String id = "dummy:id";
        ArtifactDirectoryDescriptor artifactDescriptor = store.find(ArtifactDirectoryDescriptor.class, id);
        if (artifactDescriptor == null) {
            artifactDescriptor = store.create(ArtifactDirectoryDescriptor.class, id);
            artifactDescriptor.setGroup("dummy");
            artifactDescriptor.setName("dummy");
            artifactDescriptor.setVersion("dummy");
            artifactDescriptor.setClassifier("dummy");
            artifactDescriptor.setType("dummy");
        }
        return artifactDescriptor;
    }

    @Override
    public void withOptions(final CommandLine options) {
        if (options.hasOption("d")) {
            for (String dir : options.getOptionValues("d")) {
                if (dir.trim().length() > 0)
                    directoryNames.add(dir);
            }
        }

        if (directoryNames.isEmpty()) {
            throw new MissingConfigurationParameterException("No directories to be scanned given, use 'dirs' argument to specify some");
        }
    }

    @SuppressWarnings("static-access")
    @Override
    protected void addFunctionSpecificOptions(final List<Option> options) {
        options.add(OptionBuilder.withArgName("d").withLongOpt("dirs").withDescription("directories to be scanned, comma separated").withValueSeparator(',')
                .hasArgs().create("d"));
    }
}
TOP

Related Classes of com.buschmais.jqassistant.scm.cli.ClassToNeo4JImporter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.