All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.obolibrary.oboformat.model.OBODoc Maven / Gradle / Ivy

There is a newer version: 5.5.0
Show newest version
package org.obolibrary.oboformat.model;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import org.obolibrary.obo2owl.OboInOwlCardinalityTools;
import org.obolibrary.oboformat.model.Frame.FrameType;
import org.obolibrary.oboformat.parser.OBOFormatConstants.OboFormatTag;

/** An OBODoc is a container for a header frame and zero or more entity frames. */
public class OBODoc {

    /** The header frame. */
    protected Frame headerFrame;
    /** The term frame map. */
    @Nonnull
    protected final Map termFrameMap = new HashMap<>();
    /** The typedef frame map. */
    @Nonnull
    protected final Map typedefFrameMap = new HashMap<>();
    /** The instance frame map. */
    @Nonnull
    protected final Map instanceFrameMap = new HashMap<>();
    /** The annotation frames. */
    @Nonnull
    protected final Collection annotationFrames = new LinkedList<>();
    /** The imported obo docs. */
    protected Collection importedOBODocs = new LinkedList<>();

    /** default constructor. */
    public OBODoc() {}

    /** @return the header frame */
    public Frame getHeaderFrame() {
        return headerFrame;
    }

    /**
     * @param headerFrame
     *        the new header frame
     */
    public void setHeaderFrame(Frame headerFrame) {
        this.headerFrame = headerFrame;
    }

    /** @return the term frames */
    @SuppressWarnings("null")
    @Nonnull
    public Collection getTermFrames() {
        return termFrameMap.values();
    }

    /** @return the typedef frames */
    @SuppressWarnings("null")
    @Nonnull
    public Collection getTypedefFrames() {
        return typedefFrameMap.values();
    }

    /** @return the instance frames */
    @SuppressWarnings("null")
    @Nonnull
    public Collection getInstanceFrames() {
        return instanceFrameMap.values();
    }

    /**
     * @param id
     *        the id
     * @return the term frame
     */
    @Nullable
    public Frame getTermFrame(String id) {
        return getTermFrame(id, false);
    }

    /**
     * @param id
     *        the id
     * @param followImport
     *        the follow import
     * @return the term frame
     */
    @Nullable
    public Frame getTermFrame(String id, boolean followImport) {
        if (!followImport) {
            return termFrameMap.get(id);
        }
        // this set is used to check for cycles
        Set visited = new HashSet<>();
        visited.add(getHeaderDescriptor());
        return getTermFrame(id, visited);
    }

    /**
     * @param id
     *        the id
     * @param visitedDocs
     *        the visited docs
     * @return the frame
     */
    @Nullable
    private Frame getTermFrame(String id, @Nonnull Set visitedDocs) {
        Frame f = termFrameMap.get(id);
        if (f != null) {
            return f;
        }
        for (OBODoc doc : importedOBODocs) {
            String headerDescriptor = doc.getHeaderDescriptor();
            if (!visitedDocs.contains(headerDescriptor)) {
                visitedDocs.add(headerDescriptor);
                f = doc.getTermFrame(id, true);
            }
            if (f != null) {
                return f;
            }
        }
        return null;
    }

    /**
     * @param id
     *        the id
     * @return the typedef frame
     */
    @Nullable
    public Frame getTypedefFrame(String id) {
        return getTypedefFrame(id, false);
    }

    /**
     * @param id
     *        the id
     * @param followImports
     *        the follow imports
     * @return the typedef frame
     */
    @Nullable
    public Frame getTypedefFrame(String id, boolean followImports) {
        if (!followImports) {
            return typedefFrameMap.get(id);
        }
        // this set is used to check for cycles
        Set visited = new HashSet<>();
        visited.add(getHeaderDescriptor());
        return getTypedefFrame(id, visited);
    }

    /**
     * @param id
     *        the id
     * @param visitedDocs
     *        the visited docs
     * @return the frame
     */
    @Nullable
    private Frame getTypedefFrame(String id, @Nonnull Set visitedDocs) {
        Frame f = typedefFrameMap.get(id);
        if (f != null) {
            return f;
        }
        for (OBODoc doc : importedOBODocs) {
            String headerDescriptor = doc.getHeaderDescriptor();
            if (!visitedDocs.contains(headerDescriptor)) {
                visitedDocs.add(headerDescriptor);
                f = doc.getTypedefFrame(id, true);
            }
            if (f != null) {
                return f;
            }
        }
        return null;
    }

    /**
     * @param id
     *        the id
     * @return the instance frame
     */
    public Frame getInstanceFrame(String id) {
        return instanceFrameMap.get(id);
    }

    /** @return the imported obo docs */
    public Collection getImportedOBODocs() {
        return importedOBODocs;
    }

    /**
     * @param importedOBODocs
     *        the new imported obo docs
     */
    public void setImportedOBODocs(Collection importedOBODocs) {
        this.importedOBODocs = importedOBODocs;
    }

    /**
     * Adds the imported obo doc.
     * 
     * @param doc
     *        the doc
     */
    public void addImportedOBODoc(OBODoc doc) {
        if (importedOBODocs == null) {
            importedOBODocs = new ArrayList<>();
        }
        importedOBODocs.add(doc);
    }

    /**
     * Adds the frame.
     * 
     * @param f
     *        the frame
     * @throws FrameMergeException
     *         the frame merge exception
     */
    public void addFrame(@Nonnull Frame f) throws FrameMergeException {
        if (f.getType() == FrameType.TERM) {
            addTermFrame(f);
        } else if (f.getType() == FrameType.TYPEDEF) {
            addTypedefFrame(f);
        } else if (f.getType() == FrameType.INSTANCE) {
            addInstanceFrame(f);
        }
    }

    /**
     * Adds the term frame.
     * 
     * @param f
     *        the frame
     * @throws FrameMergeException
     *         the frame merge exception
     */
    public void addTermFrame(@Nonnull Frame f) throws FrameMergeException {
        String id = f.getId();
        if (termFrameMap.containsKey(id)) {
            termFrameMap.get(id).merge(f);
        } else {
            termFrameMap.put(id, f);
        }
    }

    /**
     * Adds the typedef frame.
     * 
     * @param f
     *        the frame
     * @throws FrameMergeException
     *         the frame merge exception
     */
    public void addTypedefFrame(@Nonnull Frame f) throws FrameMergeException {
        String id = f.getId();
        if (typedefFrameMap.containsKey(id)) {
            typedefFrameMap.get(id).merge(f);
        } else {
            typedefFrameMap.put(id, f);
        }
    }

    /**
     * Adds the instance frame.
     * 
     * @param f
     *        the frame
     * @throws FrameMergeException
     *         the frame merge exception
     */
    public void addInstanceFrame(@Nonnull Frame f) throws FrameMergeException {
        String id = f.getId();
        if (instanceFrameMap.containsKey(id)) {
            instanceFrameMap.get(id).merge(f);
        } else {
            instanceFrameMap.put(id, f);
        }
    }

    /**
     * Looks up the ID prefix to IRI prefix mapping. Header-Tag: idspace
     * 
     * @param prefix
     *        prefix
     * @return IRI prefix as string
     */
    @Nullable
    public static String getIDSpace(@Nonnull String prefix) {
        // built-in
        if (prefix.equals("RO")) {
            return "http://purl.obolibrary.org/obo/RO_";
        }
        // TODO
        return null;
    }

    /**
     * @param prefix
     *        the prefix
     * @return true, if is treat xrefs as equivalent
     */
    public static boolean isTreatXrefsAsEquivalent(@Nullable String prefix) {
        if ("RO".equals(prefix)) {
            return true;
        }
        return false;
    }

    /**
     * Merge contents.
     * 
     * @param extDoc
     *        the external doc
     * @throws FrameMergeException
     *         the frame merge exception
     */
    public void mergeContents(@Nonnull OBODoc extDoc)
            throws FrameMergeException {
        for (Frame f : extDoc.getTermFrames()) {
            assert f != null;
            addTermFrame(f);
        }
        for (Frame f : extDoc.getTypedefFrames()) {
            assert f != null;
            addTypedefFrame(f);
        }
        for (Frame f : extDoc.getInstanceFrames()) {
            assert f != null;
            addInstanceFrame(f);
        }
    }

    /**
     * Adds the default ontology header.
     * 
     * @param defaultOnt
     *        the default ont
     */
    public void addDefaultOntologyHeader(String defaultOnt) {
        Frame hf = getHeaderFrame();
        Clause ontClause = hf.getClause(OboFormatTag.TAG_ONTOLOGY);
        if (ontClause == null) {
            ontClause = new Clause(OboFormatTag.TAG_ONTOLOGY, defaultOnt);
            hf.addClause(ontClause);
        }
    }

    /**
     * Check this document for violations, i.e. cardinality constraint
     * violations.
     * 
     * @throws FrameStructureException
     *         the frame structure exception
     * @see OboInOwlCardinalityTools for equivalent checks in OWL
     */
    public void check() throws FrameStructureException {
        getHeaderFrame().check();
        for (Frame f : getTermFrames()) {
            f.check();
        }
        for (Frame f : getTypedefFrames()) {
            f.check();
        }
        for (Frame f : getInstanceFrames()) {
            f.check();
        }
    }

    @Nonnull
    @Override
    public String toString() {
        return getHeaderDescriptor();
    }

    /** @return the header descriptor */
    @Nonnull
    private String getHeaderDescriptor() {
        return "OBODoc(" + headerFrame + ')';
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy