package org.serinus.graph.dao; import java.util.Date; import java.util.List; import java.util.UUID; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.index.IndexHits; import org.serinus.data.Task; import org.serinus.graph.GraphManager; import org.serinus.graph.SerinusRelationshipType; import org.serinus.graph.domain.Doing; import org.serinus.graph.domain.Person; import org.serinus.graph.domain.Topic; import org.serinus.graph.interceptor.GraphTransaction; import org.serinus.parser.SerinusParser; @ApplicationScoped @GraphTransaction public class SerinusDao { @Inject private GraphManager graphManager; @Inject SerinusParser serinuParser; public void newSerinusTask(Task task) { Person person = checkCreateUser(Person.EMAIL, task.getAuthor()); Doing doing = createDoing(task.getDate(), task.getUuid(), task.getOriginal()); person.getUnderlyingNode().createRelationshipTo( doing.getUnderlyingNode(), SerinusRelationshipType.DOING); // Relationship with another person serinusRelationshipTopic(doing, task); // Relationship with another topics // serinusRelationshipPerson(doing, task); } public void serinusRelationshipTopic(Doing doing, Task task) { List<String> topics = serinuParser.parserTopics(task.getOriginal()); for (String top : topics) { Topic topic = checkCreateTopic(top); doing.getUnderlyingNode().createRelationshipTo( topic.getUnderlyingNode(), SerinusRelationshipType.ABOUT); } } /** * Must wait until have relationship between email and name and username * * @param doing * @param task */ @Deprecated public void serinusRelationshipPerson(Doing doing, Task task) { List<String> users = serinuParser.parserUsers(task.getOriginal()); for (String user : users) { Person person = checkCreateUser(Person.NAME, user); doing.getUnderlyingNode().createRelationshipTo( person.getUnderlyingNode(), SerinusRelationshipType.NAMED); } } protected Doing createDoing(Date created, String uuid, String mesg) { Doing doing = new Doing(graphManager.getGraphDatabaseService() .createNode()); doing.setCreated(created); doing.setUuid(uuid); doing.setDoing(mesg); return doing; } protected Person checkCreateUser(String attr, String value) { IndexHits<Node> query = graphManager.getIndexPerson() .query(attr, value); Node person = query.getSingle(); if (person != null) return new Person(person); else { Person created = createUser(value); graphManager.getIndexPerson().add(created.getUnderlyingNode(), attr, value); return created; } } protected Person createUser(String email) { // TODO: Se puede buscar la información del usuario en otro sistema Person person = new Person(graphManager.getGraphDatabaseService() .createNode()); person.setEmail(email); person.setUuid(UUID.randomUUID().toString()); return person; } protected Topic checkCreateTopic(String topic) { IndexHits<Node> query = graphManager.getIndexTopic().query(Topic.NAME, topic); Node to = query.getSingle(); if (to != null) return new Topic(to); else { Topic created = createTopic(topic); graphManager.getIndexTopic().add(created.getUnderlyingNode(), Person.NAME, topic); return created; } } protected Topic createTopic(String topic) { Topic to = new Topic(graphManager.getGraphDatabaseService() .createNode()); to.setCreated(new Date()); to.setName(topic); to.setUuid(UUID.randomUUID().toString()); return to; } }