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

com.bigdata.rdf.sail.remote.BigdataSailRemoteRepository Maven / Gradle / Ivy

/**

Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016.  All rights reserved.

Contact:
     SYSTAP, LLC DBA Blazegraph
     2501 Calvert ST NW #106
     Washington, DC 20008
     [email protected]

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; version 2 of the License.

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, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package com.bigdata.rdf.sail.remote;

import java.io.File;
import java.util.Collection;
import java.util.UUID;

import org.openrdf.model.ValueFactory;
import org.openrdf.model.impl.ValueFactoryImpl;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;

import com.bigdata.rdf.sail.model.RunningQuery;
import com.bigdata.rdf.sail.webapp.client.RemoteRepository;
import com.bigdata.rdf.sail.webapp.client.RemoteRepositoryManager;

/**
 * An fully compliant implementation of Sesame's {@link Repository} that wraps
 * the blazegraph remote API. Additional functionality is available using the
 * blazegraph {@link RemoteRepositoryManager}. The proper incantation to create
 * an instance of this class is:
 * 
 * 
 * // Create client for the remote service.
 * final RemoteRepositoryManager mgr = new RemoteRepositoryManager(serviceURL);
 * try {
 *    // Obtain a Sesame Repository for the default sparql endpoint on that
 *    // service.
 *    final Repository repo = mgr.getRepositoryForDefaultNamespace()
 *          .getBigdataSailRemoteRepository();
 *    try {
 *       doWork(repo);
 *    } finally {
 *       repo.close();
 *    }
 * } finally {
 *    mgr.close();
 * }
 * 
* * This pattern makes it possible to: *
    *
  • Obtain {@link BigdataSailRemoteRepository} objects for different sparql * end points on the same blazegraph server.
  • *
  • Those {@link BigdataSailRemoteRepository} objects are flyweight.
  • *
  • The {@link RemoteRepositoryManager} can be used to access additional * interfaces, including the multi-tenancy API and the transaction API.
  • *
* *

Transactions

* * The database supports read/write transactions since 1.5.2. Transaction * manager is at the database layer, not the {@link Repository} or * {@link RepositoryConnection}. Therefore a namespace DOES NOT need to be * configured for isolatable indices in order to create and manipulate * transactions, but it DOES need to be configured with isolatable indices in * order for you to WRITE on the namespace using a transaction. * * @see com.bigdata.rdf.sail.webapp.client.RemoteTransactionManager * @see com.bigdata.rdf.sail.BigdataSail.Options#ISOLATABLE_INDICES * @see BigdataSailRemoteRepositoryConnection */ public class BigdataSailRemoteRepository implements Repository { /** * Initially open (aka initialized). */ private volatile boolean open = true; /** * non-null iff the {@link RemoteRepositoryManager} is allocated * by the constructor, in which case it is scoped to the life cycle of this * {@link BigdataSailRemoteRepository} instance. */ private final RemoteRepositoryManager our_mgr; /** * Always non-null. This is either an object that we have * created ourselves or one that was passed in by the caller. If we create * this object, then we own its life cycle and will close it when this * object is closed. In this case it will also be a * {@link RemoteRepositoryManager} rather than just a * {@link RemoteRepository}. */ private final RemoteRepository remoteRepository; /** * This exists solely for {@link #getValueFactory()} - the value factory * is not used inside of this class. */ private final ValueFactory valueFactory = ValueFactoryImpl.getInstance(); /** * The object used to communicate with that remote repository. */ public RemoteRepository getRemoteRepository() { return remoteRepository; } /** * Constructor that simply specifies an endpoint. This class will internally * allocate a {@link RemoteRepositoryManager} that is scoped to the life * cycle of this class. The allocated {@link RemoteRepositoryManager} will be * closed when this {@link BigdataSailRemoteRepository} is closed. *

* Note: This constructor pattern is NOT flyweight. * * @param sparqlEndpointURL * The SPARQL end point URL */ @Deprecated // This is broken because the sparqlEndpointURL is not the serviceURL and that is what the RRM expects/needs. public BigdataSailRemoteRepository(final String sparqlEndpointURL) { if (sparqlEndpointURL == null) throw new IllegalArgumentException(); /* * Allocate a RemoteRepositoryManager. This is NOT a flyweight operation. * */ this.our_mgr = new RemoteRepositoryManager(sparqlEndpointURL, false/*useLBS*/); this.remoteRepository = our_mgr.getRepositoryForURL(sparqlEndpointURL); } /** * Flyweight constructor wraps the blazegraph remote client for a SPARQL * endpoint as an openrdf {@link Repository}. * * @see RemoteRepository#getBigdataSailRemoteRepository() */ public BigdataSailRemoteRepository(final RemoteRepository repo) { if (repo == null) throw new IllegalArgumentException(); // use the manager associated with the provided client. this.our_mgr = null; this.remoteRepository = repo; } @Override synchronized public void shutDown() throws RepositoryException { if (our_mgr != null) { /* * The RemoteRepositoryManager object was create by our constructor, so * we own its life cycle and will close it down here. */ try { our_mgr.close(); } catch (Exception e) { throw new RepositoryException(e); } } open = false; } @Override public BigdataSailRemoteRepositoryConnection getConnection() throws RepositoryException { return new BigdataSailRemoteRepositoryConnection(this); } @Override public void initialize() throws RepositoryException { if (!open) throw new RepositoryException("Can not re-initialize"); } @Override public boolean isInitialized() { return open; } @Override public boolean isWritable() throws RepositoryException { return open; } /** * Unsupported operation * * @throws UnsupportedOperationException */ @Override public void setDataDir(File dataDir) { throw new UnsupportedOperationException(); } /** * Unsupported operation * * @throws UnsupportedOperationException */ @Override public File getDataDir() { throw new UnsupportedOperationException(); } /** * Return a client-only {@link ValueFactory} implementation. */ @Override public ValueFactory getValueFactory() { return valueFactory; } /** * Cancel the query specified by the UUID. * * @param queryId * @throws Exception */ public void cancel(UUID queryId) throws Exception { this.our_mgr.cancel(queryId); } /** * Return a collection containing Metadata objects about the * currently running queries. * * @return * @throws Exception */ public Collection showQueries() throws Exception { return this.our_mgr.showQueries(); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy