/******************************************************************************* * Copyright 2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package emlab.repository; import java.lang.reflect.ParameterizedType; import java.util.Collections; import java.util.List; import java.util.NoSuchElementException; import java.util.Random; import javax.script.ScriptEngine; import org.apache.log4j.Logger; import org.neo4j.graphdb.traversal.TraversalDescription; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.neo4j.aspects.core.NodeBacked; import org.springframework.data.neo4j.repository.GraphRepository; import org.springframework.data.neo4j.support.Neo4jTemplate; import com.tinkerpop.blueprints.pgm.Vertex; import com.tinkerpop.blueprints.pgm.impls.neo4j.Neo4jGraph; import com.tinkerpop.pipes.AbstractPipe; import com.tinkerpop.pipes.Pipe; import com.tinkerpop.pipes.util.Pipeline; import com.tinkerpop.pipes.util.SingleIterator; import emlab.util.Utils; public abstract class AbstractRepository<T extends NodeBacked> { Logger logger = Logger.getLogger(AbstractRepository.class); ScriptEngine engine = null; @Autowired private Neo4jTemplate template; private GraphRepository<T> finder() { return this.template.repositoryFor(getActualType()); } /* * Finder methods */ public Iterable<T> findAllByPropertyValue(String property, Object value) { return finder().findAllByPropertyValue(property, value); } public T findByPropertyValue(String property, Object value) { return finder().findByPropertyValue(property, value); } public Iterable<T> findAll() { return finder().findAll(); } public Iterable<T> findAllAtRandom() { List<T> list = Utils.asList(findAll()); Collections.shuffle(list, new Random()); return list; } public T findById(long id) { return finder().findOne(id); } public long count() { return finder().count(); } public <E extends NodeBacked> Iterable<T> findAllByTraversal(E startNode, TraversalDescription traversalDescription) { return finder().findAllByTraversal(startNode, traversalDescription); } public <E extends NodeBacked> Iterable<T> findAllByPipe(E startNode, Pipe<Vertex, Vertex> pipe) { Vertex startVertex = getVertex(startNode); Pipe<Vertex, T> typed = new MappingPipe(); Pipe<Vertex, T> emit = new Pipeline<Vertex, T>(pipe, typed); emit.setStarts(new SingleIterator<Vertex>(startVertex)); return emit; } @SuppressWarnings("unchecked") public Class<T> getActualType() { ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass(); return (Class<T>) parameterizedType.getActualTypeArguments()[0]; } public <E extends NodeBacked> Vertex getVertex(E e) { return (new Neo4jGraph(template.getGraphDatabaseService())).getVertex(e.getNodeId()); } class MappingPipe extends AbstractPipe<Vertex, T> implements Pipe<Vertex, T> { @Override protected T processNextStart() throws NoSuchElementException { Vertex v = this.starts.next(); return finder().findOne((Long) v.getId()); } } }