LearnPAd/learnpad

View on GitHub
lp-ontology-recommender/src/main/resources/gate/plugins/Ontology/src/gate/creole/ontology/impl/sesame/SesameManager.java

Summary

Maintainability
F
3 days
Test Coverage
/*
 *  SesameManager.java
 *
 *  Copyright (c) 1995-2012, The University of Sheffield. See the file
 *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
 *
 *  This file is part of GATE (see http://gate.ac.uk/), and is free
 *  software, licenced under the GNU Library General Public License,
 *  Version 2, June 1991 (in the distribution as file licence.html,
 *  and also available at http://gate.ac.uk/gate/licence.html).
 *
 *  Johann Petrak, 2009-07-26
 *
 *  $Id: SesameManager.java 17551 2014-03-06 11:08:34Z johann_p $
 */
package gate.creole.ontology.impl.sesame;

import gate.creole.ontology.impl.OURIImpl;
import gate.creole.ontology.DataType;
import gate.creole.ontology.GateOntologyException;
import gate.creole.ontology.InvalidValueException;
import gate.creole.ontology.LiteralOrONodeID;
import gate.creole.ontology.OConstants;
import gate.creole.ontology.ONodeID;
import gate.creole.ontology.OURI;
import java.io.File;
import java.net.URISyntaxException;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.StringReader;
import java.io.InputStream;
import java.io.Reader;

import java.util.HashSet;
import java.util.Set;
import org.apache.log4j.Logger;
import org.openrdf.model.Graph;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.impl.GraphImpl;
import org.openrdf.model.util.GraphUtil;
import org.openrdf.model.util.GraphUtilException;
import org.openrdf.query.MalformedQueryException;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.sail.memory.MemoryStore;
import org.openrdf.repository.manager.LocalRepositoryManager;
import org.openrdf.repository.manager.RemoteRepositoryManager;
import org.openrdf.repository.manager.RepositoryManager;
import org.openrdf.rio.RDFFormat;
import org.openrdf.rio.RDFParser;
import org.openrdf.rio.Rio;
import org.openrdf.rio.helpers.StatementCollector;
import org.openrdf.model.Resource;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.repository.DelegatingRepository;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.config.DelegatingRepositoryImplConfig;
import org.openrdf.repository.config.RepositoryConfig;
import org.openrdf.repository.config.RepositoryConfigException;
import org.openrdf.repository.config.RepositoryConfigSchema;
import org.openrdf.repository.config.RepositoryConfigUtil;
import org.openrdf.repository.config.RepositoryFactory;
import org.openrdf.repository.config.RepositoryImplConfig;
import org.openrdf.repository.config.RepositoryRegistry;
import org.openrdf.sail.memory.model.MemValueFactory;
import gate.creole.ontology.OntologyTupleQuery;
import gate.creole.ontology.impl.LiteralOrONodeIDImpl;
import gate.creole.ontology.impl.OBNodeIDImpl;
import gate.creole.ontology.impl.ONodeIDImpl;
import java.util.Locale;
import org.openrdf.http.client.HTTPClient;
import org.openrdf.model.BNode;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
import org.openrdf.model.impl.BNodeImpl;
import org.openrdf.model.impl.LiteralImpl;
import org.openrdf.model.impl.URIImpl;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.Update;
/**
 * A class to encapsulate management of a Sesame2 repository and
 * make handling different repository types easier.
 * This class exposes as few Sesame-internal classes as possible.
 * All errors are handled by throwing its own runtime exception
 * SesameManagerException.
 * <p>
 * In order to create repositories the following protocol
 * of calling methods must be observed:
 *
 *
 * @author Johann Petrak
 */
public class SesameManager {
  private RepositoryConnection mRepositoryConnection;
  private Repository           mRepository;
  private RepositoryManager    mRepositoryManager;
  private String               mRepositoryLocation;
  private String               mRepositoryName;
  private static final Pattern TOKEN_PATTERN =
      Pattern.compile("\\{%[\\p{Print}&&[^\\}]]+%\\}");

  private boolean debug = true;

  private class SesameManagerException
      extends RuntimeException {
    public SesameManagerException() {}

    public SesameManagerException(String message) {
      super(message);
    }

    public SesameManagerException(String message, Throwable cause) {
      super(message, cause);
    }

    public SesameManagerException(Throwable e) {
      super(e);
    }
    /**
     * Overridden so we can print the enclosed exception's stacktrace too.
     */
    public void printStackTrace() {
      printStackTrace(System.err);
    }

    /**
     * Overridden so we can print the enclosed exception's stacktrace too.
     */
    public void printStackTrace(java.io.PrintStream s) {
      s.flush();
      super.printStackTrace(s);
      Throwable cause = getCause();
      if (cause != null) {
        s.print("Caused by:\n");
        cause.printStackTrace(s);
      }
    }

    /**
     * Overridden so we can print the enclosed exception's stacktrace too.
     */
    public void printStackTrace(java.io.PrintWriter s) {
      s.flush();
      super.printStackTrace(s);
      Throwable cause = getCause();
      if (cause != null) {
        s.print("Caused by:\n");
        cause.printStackTrace(s);
      }
    }
  }

    private Logger logger;

    public SesameManager() {
      logger = Logger.getLogger(this.getClass().getName());
    }



  boolean isManagedRepository = false;

    /**
     * Connect to a managed repository located at the given location
     * and connect to the repository with the given name.
     * The repository connection is assumed to be remote if it starts with
     * http:// or https://, otherwise the location is assumed to be a local
     * directory name.
     * 
     * @param repositoryLocation
     * @param repositoryName
     */
    public void connectToRepository(String repositoryLocation, String repositoryName) {
    // connect to location and get the manager
    closeRepository();
    connectToLocation(repositoryLocation);
    openRepository(repositoryName);
  }
    public void connectToRepository(java.net.URL repositoryLocation, String repositoryName) {
    // connect to location and get the manager
    closeRepository();
    connectToLocation(repositoryLocation);
    openRepository(repositoryName);
  }

    /**
     * Connect to a managed repository location.
     * The repository connection is assumed to be remote if it starts with
     * http:// or https://, otherwise the location is assumed to be a local
     * directory name.
     * 
     * @param repositoryLocation
     */
    public void connectToLocation(String repositoryLocation) {
    // if the location starts with http:// it will be assumed that this
    // is a remote location, otherwise it will be regarded as a directory
    // name.
      logger.debug("Calling SesameManager.connectToLocation with String: "+repositoryLocation);
    if(repositoryLocation.startsWith("http://") ||
       repositoryLocation.startsWith("https://")) {
      connectToRemoteLocation(repositoryLocation);
    } else {
      connectToLocalLocation(repositoryLocation,true);
    }
  }
    public void connectToLocation(java.net.URL repositoryLocation) {
    // if the location starts with http:// it will be assumed that this
    // is a remote location, otherwise it will be regarded as a directory
    // name.
      logger.debug("Calling SesameManager.connectToLocation with URL: "+repositoryLocation);
      logger.debug("Protocol is: "+repositoryLocation.getProtocol());
    if(repositoryLocation.getProtocol().startsWith("http")) {
      connectToRemoteLocation(repositoryLocation.toString());
    } else {
      connectToLocalLocation(repositoryLocation,true);
    }
  }

    /**
     * Connect to a remote managed repository location.
     * 
     * @param url
     */
    public void connectToRemoteLocation(String url) {
      isManagedRepository = true;
      HTTPClient httpClient = new HTTPClient();
      httpClient.setQueryURL(url);
      httpClient.setUpdateURL(url);
      RemoteRepositoryManager mgr = new RemoteRepositoryManager(url);
      try {
        java.net.URL javaurl = new java.net.URL(url);
        String userpass = javaurl.getUserInfo();
        if(userpass != null) {
          String[] userpassfields = userpass.split(":");
          if(userpassfields.length != 2) {
            throw new SesameManagerException("URL has login data but not username and password");
          } else {
            mgr.setUsernameAndPassword(userpassfields[0], userpassfields[1]);
          }
        }
      } catch(Exception ex) {
        throw new SesameManagerException("Problem processing remote URL: "+ex);
      }
      setManager(mgr, url);
    
  }

  /**
   * Connect to a local repository location at the given directory.
   * If mustexist is true, it is an error if the directory is not found.
   *
   * @param dirname
   * @param mustexist
   */
  public void connectToLocalLocation(String dirname, boolean mustexist) {
    isManagedRepository = true;
    //dirname = dirname.replaceAll("/$", "");
    File dir = new File(dirname);
    if (!dir.exists()) {
      throw new SesameManagerException("Specified path does not exist: " + 
        dir.getAbsolutePath());
    }
    if (!dir.isDirectory()) {
      throw new SesameManagerException("Specified path is not a directory: " + 
        dir.getAbsolutePath());
    }
    setManager(new LocalRepositoryManager(dir), dir.toString());

  }
  public void connectToLocalLocation(java.net.URL dirname, boolean mustexist) {
    isManagedRepository = true;
    logger.debug("Called connectToLocalLocation "+dirname+"/"+mustexist);
    File dir;
    try {
      dir = new File(dirname.toURI());
    } catch (URISyntaxException ex) {
      throw new SesameManagerException("Specified URL is invalid: "+dirname,ex);
    }
    if (!dir.exists()) {
      throw new SesameManagerException("Specified path does not exist: " +
        dir.getAbsolutePath());
    }
    if (!dir.isDirectory()) {
      throw new SesameManagerException("Specified path is not a directory: " + 
        dir.getAbsolutePath());
    }
    setManager(new LocalRepositoryManager(dir), dir.toString());

  }

    /**
     * Disconnect from a local or remote repository manager.
     * 
     */
  public void disconnect() {
    closeRepository();
    if (mRepositoryManager != null) {
      logger.debug("Shutting down the repository manager");
            mRepositoryManager.shutDown();
      logger.debug("manager is shut down");
            mRepositoryManager = null;
            mRepositoryLocation = null;
      logger.debug("manager and location set to null");
        }     
  }

  private void setManager(RepositoryManager manager, String location) {
    logger.debug("setManager called");
    try {
      disconnect();
      manager.initialize();
      mRepositoryManager = manager;
      mRepositoryLocation = location;
    } catch (RepositoryException e) {
      throw new SesameManagerException("Error initializing manager: "+e);
    }
  }

  /**
   * Open a repository with the given name at the remote or local location
   * previously connected to.
   * An error is raised if no local or remote location was set prior to
   * calling this method.
   * 
   * @param name
   */
  public void openRepository(String name) {
    logger.debug("Called openRespository with ID "+name);
    if(mRepositoryManager != null) {
      try {
        mRepository = mRepositoryManager.getRepository(name);
      } catch (Exception e) {
        throw new SesameManagerException("Could not get repository "+name+" error is "+e);
      }
      if(mRepository == null) {
        throw new SesameManagerException("Getting repository failed - no repository of this name found: "+name);
      }
      try {
        mRepositoryConnection = mRepository.getConnection();
        logger.debug("repository connection set");
      } catch (Exception e) {
        throw new SesameManagerException("Could not get connection "+name+" error is "+e);
      }
    } else {
      throw new SesameManagerException("Not connected to a repository location for openRepository "+name);
    }
  }

  /**
   * Close the currently opened repository. This works for managed and
   * unmanaged repositories.
   */
  public void closeRepository() {
        if (mRepositoryConnection != null) {
      try {
        logger.debug("Commiting the connection");
              //mRepositoryConnection.commit();
        logger.debug("Closing the connection");
        mRepositoryConnection.close();
        logger.debug("Connection closed");
        // the following is NOT needed as the manager shutDown method
        // shuts down all repositories
        // mRepository.shutDown();
        logger.debug("Repository shut down");
      } catch (RepositoryException e) {
        logger.debug("!!!!! Error: ",e);
        // TODO: do not throw exception, might still need to disconnect
        // manager!
        // throw new SesameManagerException("Could not close Repository: "+e);
      }
      mRepositoryConnection = null;
      mRepository = null;
            mRepositoryName = null;
      logger.debug("connection, repository and name set to null");
        }
  }

  // create repository from a template, no substitution of variables
  // also opens the newly created repository
  /**
   * Create a new managed repository at the current remote or local location
   * using the configuration information passed on as a string.
   * 
   * @param config
   */
  public void createRepository(String config) {
    logger.debug("createRepository called");
    if(mRepositoryManager == null) {
      throw new SesameManagerException("No connect prior to createRepository");
    }
    Repository systemRepo = mRepositoryManager.getSystemRepository();

    ValueFactory vf = systemRepo.getValueFactory();
    Graph graph = new GraphImpl(vf);
    RDFParser rdfParser = Rio.createParser(RDFFormat.TURTLE, vf);
    rdfParser.setRDFHandler(new StatementCollector(graph));
    try {
      rdfParser.parse(new StringReader(config), RepositoryConfigSchema.NAMESPACE);
    } catch (Exception e) {
      throw new SesameManagerException("Error parsing the config string: ",e);
    }
    try {
      Resource repositoryNode =
        GraphUtil.getUniqueSubject(graph, RDF.TYPE,RepositoryConfigSchema.REPOSITORY);
      RepositoryConfig repConfig = RepositoryConfig.create(graph, repositoryNode);
      repConfig.validate();
      if (RepositoryConfigUtil.hasRepositoryConfig(systemRepo, repConfig.getID())) {
        throw new SesameManagerException("Repository already exists with ID "+
          repConfig.getID());
      } else {
        RepositoryConfigUtil.updateRepositoryConfigs(systemRepo, repConfig);
        mRepository = mRepositoryManager.getRepository(repConfig.getID());
        // Sesame complains about the repository already being initialized
        // for native but not for OWLIM here ... can we always not initialize
        // here????
        try {
          mRepository.initialize();
        } catch (IllegalStateException ex) {
          System.err.println("Got an IllegalStateException, ignored: "+ex);
          // we get this if the SAIL has already been initialized, just
          // ignore and be happy that we can be sure that indeed it has
        }
        openRepository(repConfig.getID());
      }
    } catch (Exception e) {
      throw new SesameManagerException("Error creating repository",e);
    }
  }

  /**
   * Create an unmanaged repository with files stored in the directory
   * given from the configuration passed as a string.
   * 
   * @param configstring
   * @return
   * @throws java.sesame_lang.Exception
   */
  public void createUnmanagedRepository(File repositoryDirFile, String configstring) {
    isManagedRepository = false;
    logger.debug("SesameManager: creating unmanaged repo, dir is "+repositoryDirFile.getAbsolutePath());
    ValueFactory vf = new MemValueFactory();
    Graph graph = parseRdf(configstring, vf, RDFFormat.TURTLE);
    Resource repositoryNode;
    try {
      repositoryNode = GraphUtil.getUniqueSubject(graph, RDF.TYPE, RepositoryConfigSchema.REPOSITORY);
    } catch (GraphUtilException ex) {
      throw new SesameManagerException("Could not get subject of config RDF",ex);
    }
    RepositoryConfig repConfig;
    try {
      repConfig = RepositoryConfig.create(graph, repositoryNode);
    } catch (RepositoryConfigException ex) {
      throw new SesameManagerException("Could not create repository from RDF graph",ex);
    }
    try {
      repConfig.validate();
    } catch (RepositoryConfigException ex) {
      throw new SesameManagerException("Could not validate repository",ex);
    }
    RepositoryImplConfig rpc = repConfig.getRepositoryImplConfig();
    Repository repo = createRepositoryStack(rpc);
    repo.setDataDir(repositoryDirFile);
    try {
      repo.initialize();
    } catch (RepositoryException ex) {
      throw new SesameManagerException("Could not initialize repository",ex);
    }
    try {
      mRepositoryConnection = repo.getConnection();
      logger.debug("Repo dir is "+repo.getDataDir().getAbsolutePath());
      logger.debug("Repo is writable "+repo.isWritable());
    } catch (RepositoryException ex) {
      throw new SesameManagerException("Could not get connection for unmanaged repository",ex);
    }
  }

  private Graph parseRdf(String config, ValueFactory vf, RDFFormat lang) {
    Graph graph = new GraphImpl(vf);
    RDFParser rdfParser = Rio.createParser(lang, vf);
    rdfParser.setRDFHandler(new StatementCollector(graph));
    try {
      rdfParser.parse(new StringReader(config), RepositoryConfigSchema.NAMESPACE);
    } catch (Exception e) {
      throw new SesameManagerException("Could not parse rdf: " + e);
    }
    return graph;
  }

 
  private RepositoryConfig getConfig(String config) {
        Repository myRepository = new SailRepository(new MemoryStore());
    RepositoryConfig repConfig;
        try {
        myRepository.initialize();
        } catch (RepositoryException e) {
          throw new SesameManagerException("Error initializing memory store: "+e);
        }
    ValueFactory vf = myRepository.getValueFactory();
    Graph graph = new GraphImpl(vf);
    RDFParser rdfParser = Rio.createParser(RDFFormat.TURTLE, vf);
    rdfParser.setRDFHandler(new StatementCollector(graph));
    try {
      rdfParser.parse(new StringReader(config), RepositoryConfigSchema.NAMESPACE);
        Resource repositoryNode =
          GraphUtil.getUniqueSubject(graph, RDF.TYPE,RepositoryConfigSchema.REPOSITORY);
            repConfig = RepositoryConfig.create(graph, repositoryNode);
            repConfig.validate();

    } catch (Exception e) {
      throw new SesameManagerException("Error parsing the config string "+e);
    }
    return repConfig;
  }


    private Repository createRepositoryStack(RepositoryImplConfig config) {
        RepositoryFactory factory = RepositoryRegistry.getInstance().get(config.getType());
        if (factory == null) {
            throw new SesameManagerException("Unsupported repository type: " + config.getType());
        }

        Repository repository;
    try {
      repository = factory.getRepository(config);
    } catch (RepositoryConfigException ex) {
      throw new SesameManagerException("Could not get repository from factory",ex);
    }

        if (config instanceof DelegatingRepositoryImplConfig) {
            RepositoryImplConfig delegateConfig = ((DelegatingRepositoryImplConfig)config).getDelegate();

            Repository delegate = createRepositoryStack(delegateConfig);

            try {
                ((DelegatingRepository)repository).setDelegate(delegate);
            }
            catch (ClassCastException e) {
                throw new SesameManagerException(
                        "Delegate specified for repository that is not a DelegatingRepository: "
                                + delegate.getClass());
            }
        }

        return repository;
    }

  /**
   * Substitute variables in a configuration template string.
   * 
   * @param configtemplate
   * @param variables
   * @return
   */
  public static String substituteConfigTemplate(String configtemplate, Map<String,String> variables) {
    // replace all variables in the template then do the actual createRepository
    StringBuffer result = new StringBuffer(configtemplate.length()*2);
    Matcher matcher = TOKEN_PATTERN.matcher(configtemplate);
        while (matcher.find()) {
            String group = matcher.group();
      // get the variable name and default
            String[] tokensArray = group.substring(2, group.length() - 2).split("\\|");

            String var = tokensArray[0].trim();

            String value = variables.get(var);
      if(value == null) {
        // try to get the default
        if(tokensArray.length > 1) {
          value = tokensArray[1].trim();
        } else {
          value = "";
        }
      }
            matcher.appendReplacement(result, value);
        }

        matcher.appendTail(result);

    return result.toString();
  }

  /**
   * Delete the managed repository with that name.
   * 
   * @param name
   */
  public void deleteRepository(String name) {
    if(mRepositoryManager != null) {
      closeRepository();
      try {
        boolean done = mRepositoryManager.removeRepositoryConfig(name);
      } catch (RepositoryException e) {
        throw new SesameManagerException("Could not delete repository "+name+": "+e);
      } catch (RepositoryConfigException e) {
        throw new SesameManagerException("Could not delete repository "+name+": "+e);
      }
    } else {
      throw new SesameManagerException("Must be connected to a location");
    }
  }
 
  /**
   * Clear the current repository and remove all data from it.
   * 
   */
  public void clearRepository() {
    try {
      mRepositoryConnection.clear();
    } catch (RepositoryException e) {
      throw new SesameManagerException("Could not clear repository: "+e);
    }
  }


 /**
  * Load data into the current repository from a file.
  * 
  * @param from
  * @param baseURI
  * @param format
  */
  public void importIntoRepository(File from, String baseURI, String format) {
    if(mRepositoryConnection != null) {
      RDFFormat sesameFormat = RDFFormat.valueOf(format);
      if(sesameFormat==null) {
        throw new SesameManagerException(
          "Could not import - format not supported: "+format);
      }
      try {
        mRepositoryConnection.add(from,baseURI,sesameFormat);
      } catch(Exception e) {
        throw new SesameManagerException("Could not import",e);
      }
    } else {
      throw new SesameManagerException("Cannot import, no connection");
    }
  }

  /**
   * Load data into the current repository from a stream.
   * 
   * @param from
   * @param baseURI
   * @param format
   */
  public void importIntoRepository(InputStream from, String baseURI, String format) {
    if(mRepositoryConnection != null) {
      RDFFormat sesameFormat = RDFFormat.valueOf(format);
      try {
        mRepositoryConnection.add(from,baseURI,sesameFormat);
      } catch(Exception e) {
        throw new SesameManagerException("Could not import: "+e);
      }
    } else {
      throw new SesameManagerException("Cannot import, no connection");
    }
  }

  /**
   * Load data into the current repository from a reader
   * 
   * @param from
   * @param baseURI
   * @param format
   */
  public void importIntoRepository(Reader from, String baseURI, String format) {
    if(mRepositoryConnection != null) {
      RDFFormat sesameFormat = RDFFormat.valueOf(format);
      try {
        mRepositoryConnection.add(from,baseURI,sesameFormat);
      } catch(Exception e) {
        throw new SesameManagerException("Could not import: "+e);
      }
    } else {
      throw new SesameManagerException("Cannot import, no connection");
    }
  }

  /**
   * Create a query object for the current repository.
   * 
   * @param query
   * @return
   */
  public OntologyTupleQuery createQuery(String query) {
    if(mRepositoryConnection != null) {
      return new UtilTupleQueryIterator(
          this,
          query,
          OConstants.QueryLanguage.SPARQL);
    } else {
      throw new SesameManagerException("Cannot create a query, no connection");
    }
  }

  public BooleanQuery createAskQuery(String query) {
    if(mRepositoryConnection != null) {
      try {
        return mRepositoryConnection.prepareBooleanQuery(QueryLanguage.SPARQL, query);
      } catch (Exception ex) {
        throw new SesameManagerException("Could not prepare BooleanQuery",ex);
      }
    } else {
      throw new SesameManagerException("Could not create an ask query, no connection");
    }
  }

  public Update createUpdate(String query) {
    if(mRepositoryConnection != null) {
      try {
        return mRepositoryConnection.prepareUpdate(QueryLanguage.SPARQL, query);
      } catch (Exception ex) {
        throw new SesameManagerException("Could not prepare an Update operation",ex);
      }
    } else {
      throw new SesameManagerException("Cannot create an update operation, no connection");
    }
  }

  public Set<String> getRepositories() {
    if(mRepositoryManager == null) {
      return new HashSet<String>();
    }
    try {
      return mRepositoryManager.getRepositoryIDs();
    } catch (RepositoryException ex) {
      throw new SesameManagerException("Could not get repository IDs: ",ex);
    }
  }

  /**
   * Obtain the repository connection object.
   * 
   * @return
   */
  public RepositoryConnection getRepositoryConnection() {
    return mRepositoryConnection;
  }

  
  // Utility functions for converting between Sesame and our own 
  // representations
  /** 
   * Convert a Sesame literal to a GATE literal
   * 
   * @param sesameLiteral 
   * @return 
   */
  public gate.creole.ontology.Literal convertSesameLiteral2Literal(
      org.openrdf.model.Literal sesameLiteral) {
    URI sesame_datatype = sesameLiteral.getDatatype();
    String sesame_lang = sesameLiteral.getLanguage();
    
    gate.creole.ontology.Literal ret = null;
    if(sesame_datatype != null) {
      try {
        ret = new gate.creole.ontology.Literal(
          sesameLiteral.getLabel(), 
          toGateDataType(sesame_datatype));
      } catch (InvalidValueException ex) {
        throw new GateOntologyException(
            "Could not convert literal from Sesame: "+sesameLiteral,ex);
      }
    } else {
      if(sesame_lang != null) {
        ret = new gate.creole.ontology.Literal(
          sesameLiteral.getLabel(),
          lang2locale(sesame_lang));
      } else {
        ret = new gate.creole.ontology.Literal(sesameLiteral.getLabel());
      }
    }
    /*
    DataType gate_datatype = null;
    System.out.println("Converting from Sesame Literal: "+sesameLiteral+","+sesameLiteral.getDatatype()+","+sesameLiteral.getLanguage());
    if(sesame_datatype == null) {
      if(sesame_lang != null) {
        // If we find a language, we use String 
        gate_datatype = DataType.getStringDataType();
      } else {
        // if there is no Datatype and no Language, use anyType
        // gate_datatype = new DataType(new OURIImpl("http://www.w3.org/2001/XMLSchema#anyType"));
      }
    } else {
      gate_datatype = toGateDataType(sesame_datatype);
    }
    Locale locale = null;
    if(sesame_lang != null) {
      locale = lang2locale(sesame_lang);
    }
    gate.creole.ontology.Literal ret = null;
    if(locale != null) {
      ret = new gate.creole.ontology.Literal(sesameLiteral.getLabel(),locale);
    } else {
      try {
        ret = new gate.creole.ontology.Literal(sesameLiteral.getLabel(), gate_datatype);
      } catch (InvalidValueException ex) {
        // TODO: what to do here?
        throw new GateOntologyException(
            "Could not convert literal from Sesame: "+sesameLiteral);
      }
    }*/
    //System.out.println("Converted sesame to gate literal: "+sesameLiteral+"/"+ret.getValue()+","+ret.getDataType()+","+ret.getLanguage());
    return ret;
  }

  
  public org.openrdf.model.Value convertLiteralOrONodeID2SesameValue(LiteralOrONodeID val) {
    if(val.isLiteral()) {
      return toSesameLiteral(val.getLiteral());
    } else {
      ONodeID id = val.getONodeID();
      return toSesameResource(id);
    }
  }
  
  public Value toSesameValue(ONodeID id) {
    return toSesameResource(id);
  }
  
  public gate.creole.ontology.DataType toGateDataType(org.openrdf.model.URI uri) {
    if(uri == null) {
      return null;
    }
    DataType dt = new DataType(new OURIImpl(uri.toString()));
    return dt;
  }

  public Locale lang2locale(String lang) {
    if(lang == null) {
      return null;
    }
    Locale locale = new Locale(lang);
    return locale;
  }
  
  // ********************************************
  // *********************** Sesame -> Ontology 
  // ********************************************
  public ONodeID toGateONodeID(org.openrdf.model.Resource resource) {
    ONodeID onodeid = null;
    if(resource instanceof BNode) {
      return new OBNodeIDImpl(resource.stringValue());
    } else if(resource instanceof org.openrdf.model.URI) {
      return new OBNodeIDImpl(((org.openrdf.model.URI)resource).stringValue());
    } else {
      throw new SesameManagerException("Cannot convert Resource to ONodeID, not a BNode or a URI: "+resource);
    }
  }
  
  public OURI toGateOURI(org.openrdf.model.URI uri) {
    return new OURIImpl(uri.stringValue());
  }
  
  public LiteralOrONodeID toGateLiteralOrONodeID(Value v) {
    if (v instanceof BNode) {
      return new LiteralOrONodeIDImpl(new OBNodeIDImpl(v.stringValue()));
    } else if (v instanceof org.openrdf.model.Literal) {
      return new LiteralOrONodeIDImpl(
        convertSesameLiteral2Literal((org.openrdf.model.Literal) v));
    } else if (v instanceof org.openrdf.model.URI) {
      URI u = (URI) v;
      return new LiteralOrONodeIDImpl(new OURIImpl(u.stringValue()));
    } else {
      throw new SesameManagerException("Cannot convert Value to LiteralOrONodeID: " + v);
    }
  }
  
  // ******************************************** 
  // ********************** Ontology -> Sesame 
  // ********************************************
  
  /** 
   * Convert an ontology plugin ONodeID to a Sesame Resource.
   * 
   * @param node
   * @return 
   */
  public org.openrdf.model.Resource toSesameResource(ONodeID node) {
    Resource r = null;
    if (node != null) {
      if (node.isAnonymousResource()) {
        String id = node.toString();
        if (id.startsWith("_:")) {
          id = id.substring(2);
        }
        r = mRepositoryConnection.getValueFactory().createBNode(id);
      } else {
        r = mRepositoryConnection.getValueFactory().createURI(node.toString());
      }
    }
    return r;
  }
  
  /** 
   * Convert an ontology plugin OURI to a Sesame URI
   * 
   * @param node
   * @return 
   */
  public org.openrdf.model.URI toSesameURI(OURI node) {
    org.openrdf.model.URI r = null;
    if (node != null) {
      r = mRepositoryConnection.getValueFactory().createURI(node.toString());
    }
    return r;
  }
  
  
  /**
   * Convert an Ontology plugin Literal represenation into a Sesame Literal
   * 
   * @param literal
   * @return  
   */ 
  public org.openrdf.model.Literal toSesameLiteral(gate.creole.ontology.Literal literal) {
    org.openrdf.model.Literal l = null;
    if (literal != null) {
      if (literal.getLanguage() != null && !literal.getLanguage().getLanguage().equals("")) {
        l = mRepositoryConnection.
          getValueFactory().
          createLiteral(
            literal.getValue(), 
            literal.getLanguage().getLanguage());
      } else if (literal.getDataType() != null) {
        l = mRepositoryConnection.
          getValueFactory().
          createLiteral(
            literal.getValue(),
            mRepositoryConnection.
              getValueFactory().
              createURI(literal.getDataType().getXmlSchemaURIString()));
      } else {
        l = mRepositoryConnection.
          getValueFactory().
          createLiteral(literal.getValue());
      }
    }
    return l;
  }
  
  
  

}