All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apacheextras.camel.component.neo4j.Neo4jProducer Maven / Gradle / Ivy

There is a newer version: 2.23.4
Show newest version
/**************************************************************************************
 http://code.google.com/a/apache-extras.org/p/camel-extra

 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
 as published by the Free Software Foundation; either version 2
 of the License, or (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.


 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 02110-1301, USA.

 http://www.gnu.org/licenses/gpl-2.0-standalone.html
 ***************************************************************************************/
package org.apacheextras.camel.component.neo4j;

import java.util.Map;

import org.apache.camel.Exchange;
import org.apache.camel.impl.DefaultProducer;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.neo4j.core.GraphDatabase;
import org.springframework.data.neo4j.support.Neo4jTemplate;

public class Neo4jProducer extends DefaultProducer {

    private static final Logger LOGGER = LoggerFactory.getLogger(Neo4jProducer.class);

    private final Neo4jTemplate template;

    public Neo4jProducer(Neo4jEndpoint endpoint, GraphDatabase graphDatabase) {
        super(endpoint);
        this.template = new Neo4jTemplate(graphDatabase);
    }

    public Neo4jProducer(Neo4jEndpoint endpoint, GraphDatabase graphDatabase, Neo4jTemplate template) {
        super(endpoint);
        this.template = template;
    }

    @SuppressWarnings("unchecked")
    Node createNode(Object body) {
        if (body == null) {
            return template.createNode();
        } else if (body instanceof Map) {
            return template.createNode((Map)body);
        }
        throw new Neo4jException("Unsupported body type for create node [" + body.getClass() + "]");
    }
    
    Relationship createRelationship(Object body) {

        if (body instanceof SpringDataRelationship) {
            SpringDataRelationship r = (SpringDataRelationship)body;
            Object rr = template.createRelationshipBetween(r.getStart(), r.getEnd(),
                                                           r.getRelationshipEntityClass(),
                                                           r.getRelationshipType(), r.isAllowDuplicates());
            return (Relationship)rr;

        } else if (body instanceof BasicRelationship) {
            BasicRelationship r = (BasicRelationship)body;
            Object rr = template.createRelationshipBetween(r.getStart(), r.getEnd(), r.getRelationshipType(),
                                                           r.getProperties());
            return (Relationship)rr;
        }
        throw new Neo4jException("Unsupported body type for create relationship [" + body == null
            ? "null" : body.getClass() + "]");
    }

    @Override
    public void process(Exchange exchange) throws Exception {
        Object body = exchange.getIn().getBody();
        Neo4jOperation op = (Neo4jOperation)exchange.getIn().getHeader(Neo4jEndpoint.HEADER_OPERATION);
        if (op == null) {
            throw new Neo4jException("No operation specified for exchange " + exchange);
        }

        switch (op) {
        case CREATE_NODE:
            Node node = createNode(body);
            LOGGER.debug("Node created [{}]", node);
            exchange.getIn().setHeader(Neo4jEndpoint.HEADER_NODE_ID, node.getId());
            break;
        case CREATE_RELATIONSHIP:
            Relationship r = createRelationship(body);
            LOGGER.debug("Relationship created [{}]", r);
            exchange.getIn().setHeader(Neo4jEndpoint.HEADER_RELATIONSHIP_ID, r.getId());
            break;
        case REMOVE_NODE:
            removeNode(body);
            break;
        case REMOVE_RELATIONSHIP:
            removeRelationship(body);
            break;
        default:
            // do nothing here.
        }
    }

    void removeNode(Object body) {
        if (body instanceof Number) {
            LOGGER.debug("Deleting node by id [" + body + "]");
            Node node = template.getNode(((Number)body).longValue());
            template.delete(node);
        } else if (body instanceof Node) {
            template.delete(body);
        } else {
            throw new Neo4jException("Unsupported body type for remove node [" + body == null
                ? "null" : body.getClass() + "]");
        }
    }

    void removeRelationship(Object body) {
        if (body instanceof Number) {
            LOGGER.debug("Deleting relationship by id [" + body + "]");
            Relationship r = template.getRelationship(((Number)body).longValue());
            template.delete(r);
        } else if (body instanceof Relationship) {
            template.delete(body);
        } else if (body instanceof SpringDataRelationship) {
            SpringDataRelationship r = (SpringDataRelationship)body;
            template.deleteRelationshipBetween(r.getStart(), r.getEnd(), r.getRelationshipType());
        } else {
            throw new Neo4jException("Unsupported body type for remove node [" + body == null
                ? "null" : body.getClass() + "]");
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy