/* * Created on Mar 29, 2005 */ package edu.mit.simile.fresnel.selection; import java.util.Iterator; import java.util.Vector; import org.openrdf.model.Resource; import org.openrdf.model.Statement; import org.openrdf.model.URI; import org.openrdf.model.Value; import org.openrdf.repository.Repository; import org.openrdf.repository.RepositoryConnection; import org.openrdf.repository.RepositoryException; import org.openrdf.repository.RepositoryResult; /** * Selects one specific resource. * * @author ryanlee */ public class InstanceSelector implements ISelector { /** * The resource this selector selects. */ private Resource _resource; /** * Can return statements. */ private boolean _statements = true; /** * Can return resources. */ private boolean _resources = true; /** * Cannot return nodes. */ private boolean _nodes = false; /** * Create a new InstanceSelector. * * @param resource The <code>Resource</code> the instance selector selects */ public InstanceSelector(Resource resource) { this._resource = resource; } /** * Returns the resource this instance selector is based on. * * @return A <code>Resource</code> */ public Resource getInstance() { return this._resource; } /** * @see edu.mit.simile.fresnel.selection.ISelector#selectStatements(Repository, Resource) */ public Iterator<Statement> selectStatements(Repository in, Resource selected) throws InvalidResultSetException { Vector<Statement> results = null; if (selected.equals(this._resource)) { try { RepositoryConnection conn = in.getConnection(); RepositoryResult<Statement> it = conn.getStatements(selected, (URI) null, (Value) null, true); while ( it.hasNext() ) { results.add(it.next()); } it.close(); /* Inverse statements */ it = conn.getStatements(null, null, selected, true); while (it.hasNext()) { results.add(it.next()); } it.close(); conn.close(); } catch (RepositoryException e) { throw new InvalidResultSetException(e.getMessage()); } } return results.iterator(); } /** * @see edu.mit.simile.fresnel.selection.ISelector#canSelectStatements() */ public boolean canSelectStatements() { return this._statements; } /** * @see edu.mit.simile.fresnel.selection.ISelector#selectResources(Repository) */ public Iterator<Resource> selectResources(Repository in) throws InvalidResultSetException { Vector<Resource> resources = new Vector<Resource>(); resources.add(this._resource); return resources.iterator(); } /** * @see edu.mit.simile.fresnel.selection.ISelector#canSelectResources() */ public boolean canSelectResources() { return this._resources; } /** * @see edu.mit.simile.fresnel.selection.ISelector#selectNodes(Repository) */ public Iterator<Value> selectNodes(Repository in) throws InvalidResultSetException { throw new InvalidResultSetException(""); } /** * @see edu.mit.simile.fresnel.selection.ISelector#canSelectNodes() */ public boolean canSelectNodes() { return this._nodes; } /** * @see edu.mit.simile.fresnel.selection.ISelector#canSelect(Repository, Resource, URI) */ public boolean canSelect(Repository in, Resource selected, URI prop) { boolean stmtExists = false; try { RepositoryConnection conn = in.getConnection(); stmtExists = conn.hasStatement(selected, prop, (Value) null, true); conn.close(); } catch (RepositoryException e) { // TODO: how to handle exception } return (selected.equals(this._resource) && stmtExists); } /** * @see edu.mit.simile.fresnel.selection.ISelector#selectStatements(Repository, Resource) */ public boolean canSelect(Repository in, Resource selected) { boolean stmtExists = false; try { RepositoryConnection conn = in.getConnection(); stmtExists = conn.hasStatement(selected, (URI) null, (Value) null, true); conn.close(); } catch (RepositoryException e) { // TODO: how to handle exception } return (selected.equals(this._resource) && stmtExists); } /** * @see edu.mit.simile.fresnel.selection.ISelector#canSelect(Repository, Value) */ public boolean canSelect(Repository in, Value selected) { return this._nodes; } }