/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.taverna.ro.vocabs; 
import org.apache.jena.rdf.model.*;
import org.apache.jena.ontology.*;
 
/**
 * Constants for the Research Object wf4ever vocabulary
 * 
 * @see https://w3id.org/ro/2016-01-28/wf4ever
 */
public class Wf4ever {
    /** <p>The ontology model that holds the vocabulary terms</p> */
    private static final OntModel M_MODEL = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM, null );
    
    /** <p>The namespace of the vocabulary as a string</p> */
    public static final String NS = "http://purl.org/wf4ever/wf4ever#";
    
    /** <p>The namespace of the vocabulary as a string</p>
     * @return namespace as String
     * @see #NS */
    public static String getURI() {return NS;}
    
    /** <p>The namespace of the vocabulary as a resource</p> */
    public static final Resource NAMESPACE = M_MODEL.createResource( NS );
    
    public static final DatatypeProperty command = M_MODEL.createDatatypeProperty(NS + "command");

    public static final DatatypeProperty filePath = M_MODEL.createDatatypeProperty(NS + "filePath");

    public static final DatatypeProperty parameterFilePath = M_MODEL.createDatatypeProperty(NS + "parameterFilePath");
    
    public static final DatatypeProperty rootURI = M_MODEL.createDatatypeProperty(NS + "rootURI");
    
    public static final DatatypeProperty script = M_MODEL.createDatatypeProperty(NS + "script");
    
    public static final DatatypeProperty serviceURI = M_MODEL.createDatatypeProperty(NS + "serviceURI");
    
    public static final DatatypeProperty wsdlOperationName = M_MODEL.createDatatypeProperty(NS + "wsdlOperationName");
    
    public static final DatatypeProperty wsdlPortName = M_MODEL.createDatatypeProperty(NS + "wsdlPortName");
    
    public static final DatatypeProperty wsdlURI = M_MODEL.createDatatypeProperty(NS + "wsdlURI");
    
    public static final OntClass BeanshellScript = M_MODEL.createClass(NS + "BeanshellScript");
    
    public static final OntClass CommandLineTool = M_MODEL.createClass(NS + "CommandLineTool");
    
    public static final OntClass Dataset = M_MODEL.createClass(NS + "Dataset");
    
    public static final OntClass Document = M_MODEL.createClass(NS + "Document");
    
    public static final OntClass File = M_MODEL.createClass(NS + "File");

    public static final OntClass FileParameter = M_MODEL.createClass(NS + "FileParameter");
    
    public static final OntClass Image = M_MODEL.createClass(NS + "Image");

    public static final OntClass PythonScript = M_MODEL.createClass(NS + "PythonScript");

    public static final OntClass RScript = M_MODEL.createClass(NS + "RScript");

    public static final OntClass RESTService = M_MODEL.createClass(NS + "RESTService");
         
    public static final OntClass Script = M_MODEL.createClass(NS + "Script");

    public static final OntClass SOAPService = M_MODEL.createClass(NS + "SOAPService");

    public static final OntClass WebService = M_MODEL.createClass(NS + "WebService");
    
    public static final OntClass WorkflowResearchObject = M_MODEL.createClass(NS + "WorkflowResearchObject");
    
}
