/*
* Copyright (c) 2008-2009 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.remote.transports;
import java.rmi.RemoteException;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
import java.rmi.server.UnicastRemoteObject;
import org.neo4j.graphdb.Direction;
import org.neo4j.remote.BasicGraphDatabaseServer;
import org.neo4j.remote.ClientConfigurator;
import org.neo4j.remote.Configuration;
import org.neo4j.remote.IterableSpecification;
import org.neo4j.remote.NodeSpecification;
import org.neo4j.remote.RelationshipSpecification;
import org.neo4j.remote.RemoteConnection;
import org.neo4j.remote.RemoteResponse;
import org.neo4j.remote.ConnectionTarget;
class RmiConnectionServer extends UnicastRemoteObject implements RmiConnection
{
private static final long serialVersionUID = 1L;
private static class LoginServer extends UnicastRemoteObject implements
RmiRemoteTarget
{
private static final long serialVersionUID = 1L;
private final ConnectionTarget site;
private int port = 0;
private RMIClientSocketFactory client = null;
private RMIServerSocketFactory server = null;
LoginServer( ConnectionTarget site ) throws RemoteException
{
this.site = site;
}
LoginServer( ConnectionTarget site, int port ) throws RemoteException
{
super( port );
this.port = port;
this.site = site;
}
LoginServer( ConnectionTarget site, int port, RMIClientSocketFactory client,
RMIServerSocketFactory server ) throws RemoteException
{
super( port, client, server );
this.site = site;
this.port = port;
this.client = client;
this.server = server;
}
public RmiConnection connect() throws RemoteException
{
return connection( site.connect() );
}
public RmiConnection connect( String username, String password )
throws RemoteException
{
return connection( site.connect( username, password ) );
}
private RmiConnection connection( RemoteConnection connection )
throws RemoteException
{
if ( client != null )
{
return new RmiConnectionServer( connection, port, client,
server );
}
else
{
return new RmiConnectionServer( connection, port );
}
}
}
private final transient RemoteConnection connection;
static RmiRemoteTarget setup( BasicGraphDatabaseServer server ) throws RemoteException
{
return new LoginServer( server );
}
static RmiRemoteTarget setup( BasicGraphDatabaseServer server, int port )
throws RemoteException
{
return new LoginServer( server, port );
}
static RmiRemoteTarget setup( BasicGraphDatabaseServer server, int port,
RMIClientSocketFactory clientSocket, RMIServerSocketFactory serverSocket )
throws RemoteException
{
return new LoginServer( server, port, clientSocket, serverSocket );
}
private RmiConnectionServer( RemoteConnection connection, int port )
throws RemoteException
{
super( port );
this.connection = connection;
}
private RmiConnectionServer( RemoteConnection connection, int port,
RMIClientSocketFactory client, RMIServerSocketFactory server )
throws RemoteException
{
super( port, client, server );
this.connection = connection;
}
public ClientConfigurator configure( Configuration config )
{
return connection.configure( config );
}
public void close()
{
connection.close();
}
public int beginTransaction()
{
return connection.beginTransaction();
}
public void commit( int transactionId )
{
connection.commit( transactionId );
}
public void rollback( int transactionId )
{
connection.rollback( transactionId );
}
public RemoteResponse<IterableSpecification<String>> getRelationshipTypes(
int transactionId )
{
return connection.getRelationshipTypes( transactionId );
}
public RemoteResponse<IterableSpecification<String>> getMoreRelationshipTypes(
int transactionId, int requestToken )
{
return connection
.getMoreRelationshipTypes( transactionId, requestToken );
}
public RemoteResponse<Void> closeRelationshipTypeIterator(
int transactionId, int requestToken )
{
// TODO Auto-generated method stub
return null;
}
public RemoteResponse<NodeSpecification> createNode( int transactionId )
{
return connection.createNode( transactionId );
}
public RemoteResponse<NodeSpecification> getReferenceNode( int transactionId )
{
return connection.getReferenceNode( transactionId );
}
public RemoteResponse<Boolean> hasNodeWithId( int transactionId, long nodeId )
{
return connection.hasNodeWithId( transactionId, nodeId );
}
public RemoteResponse<Void> deleteNode( int transactionId, long nodeId )
{
return connection.deleteNode( transactionId, nodeId );
}
public RemoteResponse<IterableSpecification<NodeSpecification>> getAllNodes(
int transactionId )
{
return connection.getAllNodes( transactionId );
}
public RemoteResponse<IterableSpecification<NodeSpecification>> getMoreNodes(
int transactionId, int requestToken )
{
return connection.getMoreNodes( transactionId, requestToken );
}
public RemoteResponse<Void> closeNodeIterator( int transactionId,
int requestToken )
{
// TODO Auto-generated method stub
return null;
}
public RemoteResponse<RelationshipSpecification> createRelationship(
int transactionId, String relationshipTypeName, long startNodeId,
long endNodeId )
{
return connection.createRelationship( transactionId,
relationshipTypeName, startNodeId, endNodeId );
}
public RemoteResponse<RelationshipSpecification> getRelationshipById(
int transactionId, long relationshipId )
{
return connection.getRelationshipById( transactionId, relationshipId );
}
public RemoteResponse<IterableSpecification<RelationshipSpecification>> getAllRelationships(
int transactionId, long nodeId, Direction direction )
{
return connection
.getAllRelationships( transactionId, nodeId, direction );
}
public RemoteResponse<IterableSpecification<RelationshipSpecification>> getRelationships(
int transactionId, long nodeId, Direction direction,
String[] relationshipTypeNames )
{
return connection.getRelationships( transactionId, nodeId, direction,
relationshipTypeNames );
}
public RemoteResponse<IterableSpecification<RelationshipSpecification>> getMoreRelationships(
int transactionId, int requestToken )
{
return connection.getMoreRelationships( transactionId, requestToken );
}
public RemoteResponse<Void> closeRelationshipIterator( int transactionId,
int requestToken )
{
// TODO Auto-generated method stub
return null;
}
public RemoteResponse<Void> deleteRelationship( int transactionId,
long relationshipId )
{
return connection.deleteRelationship( transactionId, relationshipId );
}
public RemoteResponse<Object> getNodeProperty( int transactionId,
long nodeId, String key )
{
return connection.getNodeProperty( transactionId, nodeId, key );
}
public RemoteResponse<Object> getRelationshipProperty( int transactionId,
long relationshipId, String key )
{
return connection.getRelationshipProperty( transactionId,
relationshipId, key );
}
public RemoteResponse<Object> setNodeProperty( int transactionId,
long nodeId, String key, Object value )
{
return connection.setNodeProperty( transactionId, nodeId, key, value );
}
public RemoteResponse<Object> setRelationshipProperty( int transactionId,
long relationshipId, String key, Object value )
{
return connection.setRelationshipProperty( transactionId,
relationshipId, key, value );
}
public RemoteResponse<IterableSpecification<String>> getNodePropertyKeys(
int transactionId, long nodeId )
{
return connection.getNodePropertyKeys( transactionId, nodeId );
}
public RemoteResponse<IterableSpecification<String>> getRelationshipPropertyKeys(
int transactionId, long relationshipId )
{
return connection.getRelationshipPropertyKeys( transactionId,
relationshipId );
}
public RemoteResponse<IterableSpecification<String>> getMorePropertyKeys(
int transactionId, int requestToken )
{
return connection.getMorePropertyKeys( transactionId, requestToken );
}
public RemoteResponse<Void> closePropertyKeyIterator( int transactionId,
int requestToken )
{
// TODO Auto-generated method stub
return null;
}
public RemoteResponse<Boolean> hasNodeProperty( int transactionId,
long nodeId, String key )
{
return connection.hasNodeProperty( transactionId, nodeId, key );
}
public RemoteResponse<Boolean> hasRelationshipProperty( int transactionId,
long relationshiId, String key )
{
return connection.hasRelationshipProperty( transactionId,
relationshiId, key );
}
public RemoteResponse<Object> removeNodeProperty( int transactionId,
long nodeId, String key )
{
return connection.removeNodeProperty( transactionId, nodeId, key );
}
public RemoteResponse<Object> removeRelationshipProperty(
int transactionId, long relationshipId, String key )
{
return connection.removeRelationshipProperty( transactionId,
relationshipId, key );
}
public RemoteResponse<Integer> getIndexId( String indexName )
throws RemoteException
{
return connection.getIndexServiceId( indexName );
}
public RemoteResponse<IterableSpecification<NodeSpecification>> getIndexNodes(
int transactionId, int indexId, String key, Object value )
throws RemoteException
{
return connection.getIndexNodes( transactionId, indexId, key, value );
}
public RemoteResponse<Void> indexNode( int transactionId, int indexId,
long nodeId, String key, Object value ) throws RemoteException
{
return connection
.indexNode( transactionId, indexId, nodeId, key, value );
}
public RemoteResponse<Void> removeIndexNode( int transactionId,
int indexId, long nodeId, String key, Object value )
throws RemoteException
{
return connection.removeIndexNode( transactionId, indexId, nodeId, key,
value );
}
}