package org.neo4j.smack.api;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.neo4j.smack.pipeline.database.event.Invocation;
import org.neo4j.smack.pipeline.database.event.Output;
import org.neo4j.smack.routing.annotation.DeserializeWith;
import org.neo4j.smack.routing.annotation.SerializeWith;
import org.neo4j.smack.routing.annotation.Transactional;
import org.neo4j.smack.serialization.strategy.PropertyContainerDeserialization;
import org.neo4j.smack.serialization.strategy.PropertyContainerDeserializationStrategy;
import org.neo4j.smack.serialization.strategy.PropertyValueDeserializationStrategy;
import org.neo4j.smack.serialization.strategy.RelationshipCreationDescription;
import org.neo4j.smack.serialization.strategy.RelationshipCreationDeserializationStrategy;
import org.neo4j.smack.serialization.strategy.RelationshipSerializationStrategy;
public class RelationshipService extends BasePropertyContainerService
{
@POST
@Transactional
@Path(UrlReverseLookerUpper.PATH_NODE_RELATIONSHIPS)
@DeserializeWith(RelationshipCreationDeserializationStrategy.class)
@SerializeWith(RelationshipSerializationStrategy.class)
public void createRelationship(Invocation invocation, Output result)
{
GraphDatabaseService db = invocation.getDB();
RelationshipCreationDescription relToCreate = invocation.getContent();
Node from = db.getNodeById(getNodeId(invocation));
Node to = db.getNodeById(relToCreate.getEndNodeId());
Relationship rel = from.createRelationshipTo(to, relToCreate.getType());
setProperties(rel, relToCreate);
result.createdAt(url.reverse(rel), rel);
}
@GET
@Path(UrlReverseLookerUpper.PATH_RELATIONSHIP)
@SerializeWith(RelationshipSerializationStrategy.class)
public void getRelationship(Invocation invocation, Output result)
throws Exception
{
GraphDatabaseService db = invocation.getDB();
result.ok(db.getRelationshipById(getRelationshipId(invocation)));
}
@DELETE
@Transactional
@Path(UrlReverseLookerUpper.PATH_RELATIONSHIP)
public void deleteRelationship(Invocation invocation, Output result)
throws Exception
{
invocation.getDB().getRelationshipById(getRelationshipId(invocation)).delete();
result.ok();
}
// @GET
// @Path(PATH_NODE_RELATIONSHIPS_W_DIR)
// //@SerializeWith(RepresentationSerializationStrategy.class)
// public void getNodeRelationships(Invocation invocation, Output result)
// throws Exception
// {
// final DatabaseActions.RelationshipDirection direction = DatabaseActions.RelationshipDirection
// .valueOf(getParameter(invocation, "direction"));
// result.ok(actionsFor(invocation).getNodeRelationships(
// getNodeId(invocation), direction,
// Collections.<String> emptyList()));
// }
//
// @GET
// @Path(PATH_NODE_RELATIONSHIPS_W_DIR_N_TYPES)
// //@SerializeWith(RepresentationSerializationStrategy.class)
// public void getNodeRelationshipsWithDirAndTypes(Invocation invocation,
// Output result) throws Exception
// {
// final DatabaseActions.RelationshipDirection direction = DatabaseActions.RelationshipDirection
// .valueOf(getParameter(invocation, "direction"));
// final AmpersandSeparatedCollection types = new AmpersandSeparatedCollection(
// getParameter(invocation, "types"));
// result.ok(actionsFor(invocation).getNodeRelationships(
// getNodeId(invocation), direction, types));
// }
//
// @GET
// @Path(PATH_RELATIONSHIP_PROPERTIES)
// //@SerializeWith(RepresentationSerializationStrategy.class)
// public void getAllRelationshipProperties(Invocation invocation,
// Output result) throws Exception
// {
// final PropertiesRepresentation properties = actionsFor(invocation)
// .getAllRelationshipProperties(getRelationshipId(invocation));
// if (!properties.isEmpty())
// {
// result.ok(properties);
// } else
// {
// result.ok();
// }
// }
//
// @GET
// @Path(PATH_RELATIONSHIP_PROPERTY)
// //@SerializeWith(RepresentationSerializationStrategy.class)
// public void getRelationshipProperty(Invocation invocation, Output result)
// throws Exception
// {
// result.ok(actionsFor(invocation).getRelationshipProperty(
// getRelationshipId(invocation), getKey(invocation)));
// }
@PUT
@Transactional
@Path(UrlReverseLookerUpper.PATH_RELATIONSHIP_PROPERTIES)
@DeserializeWith(PropertyContainerDeserializationStrategy.class)
public void setAllRelationshipProperties(Invocation invocation,
Output result) throws Exception
{
Relationship rel = invocation.getDB().getRelationshipById(getRelationshipId(invocation));
removeAllProperties(rel);
setProperties(rel, invocation.<PropertyContainerDeserialization>getContent());
result.okNoContent();
}
@PUT
@Transactional
@Path(UrlReverseLookerUpper.PATH_RELATIONSHIP_PROPERTY)
@DeserializeWith(PropertyValueDeserializationStrategy.class)
public void setRelationshipProperty(Invocation invocation, Output result)
throws Exception
{
Relationship rel = invocation.getDB().getRelationshipById(getRelationshipId(invocation));
rel.setProperty(getPropertyKey(invocation), invocation.getContent());
result.okNoContent();
}
// @DELETE
// @Path(PATH_RELATIONSHIP_PROPERTIES)
// public void deleteAllRelationshipProperties(Invocation invocation,
// Output result) throws Exception
// {
// actionsFor(invocation).removeAllRelationshipProperties(
// getRelationshipId(invocation));
// result.ok();
// }
//
// @DELETE
// @Path(PATH_RELATIONSHIP_PROPERTY)
// public void deleteRelationshipProperty(Invocation invocation, Output result)
// throws Exception
// {
// actionsFor(invocation).removeRelationshipProperty(
// getRelationshipId(invocation), getKey(invocation));
// result.ok();
// }
}