package org.jboss.windup.graph.service;
import org.jboss.windup.graph.GraphTypeManager;
import org.jboss.windup.graph.model.WindupVertexFrame;
import org.jboss.windup.graph.service.exception.NonUniqueResultException;
import com.thinkaurelius.titan.core.TitanTransaction;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.frames.VertexFrame;
/**
* Base service interface for interacting with {@link WindupVertexFrame} instances.
*
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*
* @param <FRAMETYPE>
*/
public interface Service<FRAMETYPE extends VertexFrame>
{
/**
* Commit any started transaction.
*
* @see #newTransaction()
*/
void commit();
/**
* Count the number of {@link WindupVertexFrame} instances of the type for which this {@link Service} operates.
*/
long count(Iterable<?> obj);
/**
* Create a new VertexFrame of the Service's type, but don't attach it to the graph.
*
* Note that only @Property annotated methods are supported by the returned object.
*/
FRAMETYPE createInMemory();
/**
* Create a new instance of the {@link WindupVertexFrame} type on which this {@link Service} operates. The returned instance will already be
* persisted in the graph.
*/
FRAMETYPE create();
/**
* Adds the type of this service to the provided {@link WindupVertexFrame}, and returns the result
*/
FRAMETYPE addTypeToModel(WindupVertexFrame model);
/**
* Remove the given {@link WindupVertexFrame} instance from the graph.
*/
void remove(FRAMETYPE model);
/**
* Find all instances of the {@link WindupVertexFrame} type on which this {@link Service} operates.
*/
Iterable<FRAMETYPE> findAll();
/**
* Find all instances of the {@link WindupVertexFrame} type on which this {@link Service} operates with the given properties.
*/
Iterable<FRAMETYPE> findAllByProperties(String[] keys, String[] vals);
/**
* Find all instances of the {@link WindupVertexFrame} type on which this {@link Service} operates with the given property.
*/
Iterable<FRAMETYPE> findAllByProperty(String key, Object value);
/**
* Find all instances of the {@link WindupVertexFrame} type on which this {@link Service} operates with the given property not set to the given
* value.
*/
Iterable<FRAMETYPE> findAllWithoutProperty(final String key, final Object value);
/**
* Find all instances of the {@link WindupVertexFrame} type on which this {@link Service} operates with the given property.
*/
Iterable<FRAMETYPE> findAllWithoutProperty(final String key);
/**
* Find all instances of the {@link WindupVertexFrame} type on which this {@link Service} operates with the specified property matching the given
* regexes.
*/
Iterable<FRAMETYPE> findAllByPropertyMatchingRegex(String key, String... regex);
/**
* Get the instance of the type on which this {@link Service} operates that has the given id value.
*/
FRAMETYPE getById(Object id);
/**
* Get a unique instance of the type on which this {@link Service} operates.
*/
FRAMETYPE getUnique() throws NonUniqueResultException;
/**
* Search the graph for a model of the appropriate type with the given property name and value. Return <code>null</code> if not found.
*/
FRAMETYPE getUniqueByProperty(String property, Object value) throws NonUniqueResultException;
/**
* Begin a transaction.
*
* @see #commit()
*/
TitanTransaction newTransaction();
/**
* Get the {@link WindupVertexFrame} type for which this {@link Service} operates.
*/
Class<FRAMETYPE> getType();
/**
* Return the given {@link Vertex} as a {@link WindupVertexFrame} (if possible.)
* <p>
* <b>Note:</b> This method will always succeed! Even if the given {@link Vertex} is not actually the specified {@link WindupVertexFrame} type.
* Call {@link GraphTypeManager#hasType(Class, Vertex)} <b>before</b> using this!
*/
FRAMETYPE frame(Vertex vertex);
}