emlab.repository.GenericRepository.java Source code

Java tutorial

Introduction

Here is the source code for emlab.repository.GenericRepository.java

Source

/*******************************************************************************
 * 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.util.Collections;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Random;

import javax.script.ScriptEngine;

import org.neo4j.graphdb.traversal.TraversalDescription;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 org.springframework.stereotype.Repository;

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;

@Repository
public class GenericRepository {

    Logger logger = LoggerFactory.getLogger(GenericRepository.class);;

    ScriptEngine engine = null;

    @Autowired
    Neo4jTemplate template;

    private <T extends NodeBacked> GraphRepository<T> finder(Class<T> clazz) {
        return this.template.repositoryFor(clazz);
    }

    public <T extends NodeBacked> Iterable<T> findAllByPropertyValue(Class<T> clazz, String property,
            Object value) {
        return finder(clazz).findAllByPropertyValue(property, value);
    }

    public <T extends NodeBacked> T findByPropertyValue(Class<T> clazz, String property, Object value) {
        return finder(clazz).findByPropertyValue(property, value);
    }

    public <T extends NodeBacked> Iterable<T> findAll(Class<T> clazz) {
        return finder(clazz).findAll();
    }

    public <T extends NodeBacked> Iterable<T> findAllAtRandom(Class<T> clazz) {
        List<T> list = Utils.asList(findAll(clazz));
        Collections.shuffle(list, new Random());
        return list;
    }

    public <T extends NodeBacked> T findOneAtRandom(Class<T> clazz) {
        List<T> list = Utils.asList(findAll(clazz));
        Collections.shuffle(list, new Random());
        return list.get(0);
    }

    public <T extends NodeBacked> T findFirst(Class<T> clazz) {
        if (finder(clazz).findAll().iterator().hasNext()) {
            return finder(clazz).findAll().iterator().next();
        } else {
            return null;
        }
    }

    public <T extends NodeBacked> T findById(Class<T> clazz, long id) {
        return finder(clazz).findOne(id);
    }

    public <T extends NodeBacked, E extends NodeBacked> Iterable<T> findAllByTraversal(Class<T> clazz, E startNode,
            TraversalDescription traversalDescription) {
        return finder(clazz).findAllByTraversal(startNode, traversalDescription);
    }

    public <T extends NodeBacked, E extends NodeBacked> Iterable<T> findAllByPipe(Class<T> clazz, E startNode,
            Pipe<Vertex, Vertex> pipe) {
        Vertex startVertex = getVertex(startNode);
        Pipe<Vertex, T> typed = new MappingPipe<T>(clazz);
        Pipe<Vertex, T> emit = new Pipeline<Vertex, T>(pipe, typed);
        emit.setStarts(new SingleIterator<Vertex>(startVertex));
        return emit;
    }

    public <T extends NodeBacked> Vertex getVertex(T e) {
        return (new Neo4jGraph(template.getGraphDatabaseService())).getVertex(e.getNodeId());
    }

    class MappingPipe<T extends NodeBacked> extends AbstractPipe<Vertex, T> implements Pipe<Vertex, T> {

        Class<T> genericClass;

        public MappingPipe(Class<T> clazz) {
            super();
            genericClass = clazz;
        }

        @Override
        protected T processNextStart() throws NoSuchElementException {
            Vertex v = this.starts.next();
            return findById(genericClass, (Long) v.getId());
        }

    }

}