/* * This file is part of the OWL API. * * The contents of this file are subject to the LGPL License, Version 3.0. * * Copyright (C) 2011, The University of Manchester * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * * Alternatively, the contents of this file may be used under the terms of the Apache License, Version 2.0 * in which case, the provisions of the Apache License Version 2.0 are applicable instead of those above. * * Copyright 2011, The University of Manchester * * 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.coode.owlapi.obo12.parser; import static org.semanticweb.owlapi.util.OWLAPIPreconditions.checkNotNull; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.Nullable; import org.semanticweb.owlapi.model.IRI; import org.semanticweb.owlapi.model.OWLOntologyID; /** * Author: Matthew Horridge<br> * Stanford University<br> * Bio-Medical Informatics Research Group<br> * Date: 19/04/2012 * <p> * Describes the types of OBO IDs that can be found in OBO Files. Taken from Section 2.5 of the OBO * Syntax and Semantics Specification. * </p> */ @SuppressWarnings("all") enum OBOIdType { //@formatter:off /** Any string with an http: or https: prefix. */ URL_AS_ID(Pattern.compile("(http:|https:)[^\\s]*"), (ontologyID, idSpaceManager, id) -> IRI.create(id)), /** Any unprefixed ID. Does not contain a colon character. The spec implies the empty string matches this ID. */ UNPREFIXED_ID(Pattern.compile("[^\\s:]*"), (ontologyID, idSpaceManager, id) -> { String ns; if (!ontologyID.isAnonymous()) { ns = ontologyID.getOntologyIRI() + "#"; } else { ns = "anonymous#"; } return IRI.create(ns, id); }), /** * Must contain a colon character in the ID. The idspace must only * consist of Alpha-Chars and possibly an underscore. The local id must * only consist of digits (possibly none). */ CANONICAL_PREFIXED_ID(Pattern.compile("([A-Za-z][A-Za-z_]*):([0-9]*)"),new OBOIIdTranslator() { @Override public IRI getIRIFromOBOId(OWLOntologyID ontologyID, IDSpaceManager idSpaceManager, String id) { Matcher matcher = CANONICAL_PREFIXED_ID.getPattern().matcher(id); matcher.matches(); String idspace = matcher.group(1); String localid = matcher.group(2); String iriPrefix = idSpaceManager.getIRIPrefix(idspace); return IRI.create(iriPrefix, idspace + "_" + localid); } }), /** * Must contain a colon character somewhere in the ID. Any kind of * prefix plus a local Id. The prefix doesn't contain a colon character. */ NON_CANONICAL_PREFIXED_ID(Pattern.compile("([^\\s:]*):([^\\s]*)"), new OBOIIdTranslator() { @Override public IRI getIRIFromOBOId(OWLOntologyID ontologyID, IDSpaceManager idSpaceManager, String id) { Matcher matcher = NON_CANONICAL_PREFIXED_ID.getPattern().matcher(id); matcher.matches(); String idspace = matcher.group(1); String localid = matcher.group(2); String iriPrefix = idSpaceManager.getIRIPrefix(idspace); return IRI.create(iriPrefix + idspace + "#", "_" + localid); } }); //@formatter:on private Pattern pattern; private OBOIIdTranslator translator; private OBOIdType(Pattern pattern, OBOIIdTranslator translator) { this.pattern = pattern; this.translator = translator; } /** * @return the pattern */ public Pattern getPattern() { return pattern; } /** * @param ontologyID * @param idSpaceManager * @param oboId * @return the translated iri */ public IRI getIRIFromOBOId(OWLOntologyID ontologyID, IDSpaceManager idSpaceManager, String oboId) { return translator.getIRIFromOBOId(ontologyID, idSpaceManager, oboId); } /** * Gets the OBOIdType for a given OBO ID. * * @param oboId The OBO ID. Must not be null. * @return The OBOIdType for the specified oboId, or <code>null</code> if the specified oboId * does not conform to any OBO Id type. */ public static @Nullable OBOIdType getIdType(String oboId) { checkNotNull(oboId, "oboId must not be null"); for (OBOIdType idType : values()) { Pattern pattern = idType.getPattern(); Matcher matcher = pattern.matcher(oboId); if (matcher.matches()) { return idType; } } return null; } private static interface OBOIIdTranslator { IRI getIRIFromOBOId(OWLOntologyID ontologyID, IDSpaceManager idSpaceManager, String id); } }