org.opencb.opencga.analysis.execution.plugins.OpenCGAAnalysis.java Source code

Java tutorial

Introduction

Here is the source code for org.opencb.opencga.analysis.execution.plugins.OpenCGAAnalysis.java

Source

/*
 * Copyright 2015-2016 OpenCB
 *
 * 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.opencb.opencga.analysis.execution.plugins;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import org.apache.commons.lang3.StringUtils;
import org.opencb.commons.datastore.core.ObjectMap;
import org.opencb.opencga.catalog.models.tool.Execution;
import org.opencb.opencga.catalog.models.tool.InputParam;
import org.opencb.opencga.storage.core.manager.variant.VariantStorageManager;
import org.opencb.opencga.storage.core.manager.variant.operations.StorageOperation;
import org.opencb.opencga.catalog.models.tool.Manifest;
import org.opencb.opencga.catalog.managers.CatalogManager;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.catalog.models.DataStore;
import org.opencb.opencga.catalog.models.File;
import org.opencb.opencga.storage.core.StorageEngineFactory;
import org.opencb.opencga.storage.core.alignment.AlignmentDBAdaptor;
import org.opencb.opencga.storage.core.exceptions.StorageEngineException;
import org.opencb.opencga.storage.core.variant.adaptors.VariantDBAdaptor;
import org.slf4j.Logger;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Created on 26/11/15.
 *
 * TODO: Move non abstract methods to a Context class
 *
 * @author Jacobo Coll <jacobo167@gmail.com>
 */
public abstract class OpenCGAAnalysis {

    private Logger logger;
    private ObjectMap params;
    private CatalogManager catalogManager;
    private String sessionId;
    private boolean initialized;
    private StorageEngineFactory storageEngineFactory;
    private long studyId;
    private String execution;
    private VariantStorageManager variantStorageManager;

    public Manifest getManifest() {
        try {
            return loadManifest(getIdentifier());
        } catch (IOException ignore) {
            logger.error("Unable to load manifest");
            return null;
        }
    }

    public static Manifest loadManifest(String identifier) throws IOException {
        final String file;
        JsonFactory factory;
        if (OpenCGAAnalysis.class.getResource("/" + identifier + "/manifest.yml") != null) {
            file = "/" + identifier + "/manifest.yml";
            factory = new YAMLFactory();
        } else if (OpenCGAAnalysis.class.getResource("/" + identifier + "/manifest.json") != null) {
            file = "/" + identifier + "/manifest.json";
            factory = new JsonFactory();
        } else if (OpenCGAAnalysis.class.getResource("/" + identifier + "/manifest.xml") != null) {
            file = "/" + identifier + "/manifest.xml";
            factory = new XmlFactory();
        } else {
            return null;
        }
        try (InputStream stream = OpenCGAAnalysis.class.getResourceAsStream(file)) {
            return new ObjectMapper(factory).readValue(stream, Manifest.class);
        }
    }

    /**
     * Get analysis identifier.
     *
     * @return Analysis identifier
     */
    public abstract String getIdentifier();

    public int run() throws Exception {
        Execution execution = getManifest().getExecutions().get(0);
        for (Execution e : getManifest().getExecutions()) {
            if (e.getId().equals(this.execution)) {
                execution = e;
                break;
            }
        }
        Map<String, Path> inputParams = new LinkedHashMap<>();
        Path outdir = Paths.get(params.getString(execution.getOutputParam()));
        for (InputParam inputParam : execution.getInputParams()) {
            String inputParamValue = params.getString(inputParam.getName());
            if (StringUtils.isNotEmpty(inputParamValue)) {
                inputParams.put(inputParam.getName(), Paths.get(inputParamValue));
            }
        }
        return run(inputParams, outdir, params);
    }

    public abstract int run(Map<String, Path> input, Path outdir, ObjectMap params) throws Exception;

    /*
     *  Util methods
     */

    final void init(Logger logger, ObjectMap configuration, CatalogManager catalogManager,
            StorageEngineFactory storageEngineFactory, long studyId, String execution, String sessionId) {
        if (initialized) {
            throw new IllegalStateException("The plugin was already initialized! Can't init twice");
        }
        this.logger = logger;
        this.params = configuration;
        this.catalogManager = catalogManager;
        this.storageEngineFactory = storageEngineFactory;
        this.variantStorageManager = new VariantStorageManager(catalogManager, this.storageEngineFactory);
        this.studyId = studyId;
        this.execution = execution;
        this.sessionId = sessionId;
        initialized = true;
    }

    protected final Logger getLogger() {
        return logger;
    }

    protected final ObjectMap getParams() {
        return params;
    }

    protected final CatalogManager getCatalogManager() {
        return catalogManager;
    }

    protected final String getSessionId() {
        return sessionId;
    }

    protected final VariantStorageManager getVariantStorageManager() {
        return variantStorageManager;
    }

    //TODO: Return a VariantDBAdaptor which checks catalog permissions
    @Deprecated
    protected final VariantDBAdaptor getVariantDBAdaptor(long studyId) throws CatalogException,
            IllegalAccessException, InstantiationException, ClassNotFoundException, StorageEngineException {

        StorageEngineFactory storageEngineFactory = this.storageEngineFactory;

        DataStore dataStore = StorageOperation.getDataStore(catalogManager, studyId, File.Bioformat.VARIANT,
                sessionId);
        String storageEngine = dataStore.getStorageEngine();
        String dbName = dataStore.getDbName();

        return storageEngineFactory.getVariantStorageEngine(storageEngine).getDBAdaptor(dbName);
    }

    //TODO: Return an AlignmentDBAdaptor which checks catalog permissions
    protected final AlignmentDBAdaptor getAlignmentDBAdaptor(long studyId) {
        throw new UnsupportedOperationException();
    }

    protected final long getStudyId() {
        return studyId;
    }

    public String getExecution() {
        return execution;
    }
}