Skip to content

Adding error check of unsupported types #482

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 9, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@
import org.neo4j.driver.internal.value.RelationshipValue;
import org.neo4j.driver.v1.Value;
import org.neo4j.driver.v1.exceptions.ClientException;
import org.neo4j.driver.v1.types.Entity;
import org.neo4j.driver.v1.types.Node;
import org.neo4j.driver.v1.types.Path;
import org.neo4j.driver.v1.types.Relationship;
Expand Down Expand Up @@ -252,79 +251,8 @@ void packInternalValue( InternalValue value ) throws IOException
}
break;

case NODE:
{
Node node = value.asNode();
packNode( node );
}
break;

case RELATIONSHIP:
{
Relationship rel = value.asRelationship();
packer.packStructHeader( 5, RELATIONSHIP );
packer.pack( rel.id() );
packer.pack( rel.startNodeId() );
packer.pack( rel.endNodeId() );

packer.pack( rel.type() );

packProperties( rel );
}
break;

case PATH:
Path path = value.asPath();
packer.packStructHeader( 3, PATH );

// Unique nodes
Map<Node,Integer> nodeIdx = Iterables.newLinkedHashMapWithSize( path.length() + 1 );
for ( Node node : path.nodes() )
{
if ( !nodeIdx.containsKey( node ) )
{
nodeIdx.put( node, nodeIdx.size() );
}
}
packer.packListHeader( nodeIdx.size() );
for ( Node node : nodeIdx.keySet() )
{
packNode( node );
}

// Unique rels
Map<Relationship,Integer> relIdx = Iterables.newLinkedHashMapWithSize( path.length() );
for ( Relationship rel : path.relationships() )
{
if ( !relIdx.containsKey( rel ) )
{
relIdx.put( rel, relIdx.size() + 1 );
}
}
packer.packListHeader( relIdx.size() );
for ( Relationship rel : relIdx.keySet() )
{
packer.packStructHeader( 3, UNBOUND_RELATIONSHIP );
packer.pack( rel.id() );
packer.pack( rel.type() );
packProperties( rel );
}

// Sequence
packer.packListHeader( path.length() * 2 );
for ( Path.Segment seg : path )
{
Relationship rel = seg.relationship();
long relEndId = rel.endNodeId();
long segEndId = seg.end().id();
int size = relEndId == segEndId ? relIdx.get( rel ) : -relIdx.get( rel );
packer.pack( size );
packer.pack( nodeIdx.get( seg.end() ) );
}
break;

default:
throw new IOException( "Unknown type: " + value );
throw new IOException( "Unknown type: " + value.type().name() );
}
}

Expand All @@ -333,32 +261,6 @@ public void write( Message msg ) throws IOException
{
msg.dispatch( this );
}

private void packNode( Node node ) throws IOException
{
packer.packStructHeader( NODE_FIELDS, NODE );
packer.pack( node.id() );

Iterable<String> labels = node.labels();
packer.packListHeader( Iterables.count( labels ) );
for ( String label : labels )
{
packer.pack( label );
}

packProperties( node );
}

private void packProperties( Entity entity ) throws IOException
{
Iterable<String> keys = entity.keys();
packer.packMapHeader( entity.size() );
for ( String propKey : keys )
{
packer.pack( propKey );
packValue( entity.get( propKey ) );
}
}
}

static class ReaderV1 implements MessageFormat.Reader
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ public MessageFormat.Reader newReader( PackInput input )
return new ReaderV2( input );
}

private static class WriterV2 extends WriterV1
static class WriterV2 extends WriterV1
{
WriterV2( PackOutput output )
{
Expand Down Expand Up @@ -226,7 +226,7 @@ private void packPoint3D( Point point ) throws IOException
}
}

private static class ReaderV2 extends ReaderV1
static class ReaderV2 extends ReaderV1
{
ReaderV2( PackInput input )
{
Expand Down
15 changes: 14 additions & 1 deletion driver/src/main/java/org/neo4j/driver/v1/Statement.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@

import java.util.Map;

import org.neo4j.driver.internal.value.MapValue;
import org.neo4j.driver.v1.exceptions.ClientException;
import org.neo4j.driver.v1.summary.ResultSummary;
import org.neo4j.driver.v1.util.Immutable;

Expand Down Expand Up @@ -52,7 +54,18 @@ public class Statement
public Statement( String text, Value parameters )
{
this.text = text;
this.parameters = parameters == null ? Values.EmptyMap : parameters;
if( parameters == null )
{
this.parameters = Values.EmptyMap;
}
else if ( parameters instanceof MapValue )
{
this.parameters = parameters;
}
else
{
throw new ClientException( "The parameters should be provided as Map type. Unsupported parameters type: " + parameters.type().name() );
}
}

/**
Expand Down
11 changes: 7 additions & 4 deletions driver/src/main/java/org/neo4j/driver/v1/Values.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,11 @@
import org.neo4j.driver.internal.value.LocalDateTimeValue;
import org.neo4j.driver.internal.value.LocalTimeValue;
import org.neo4j.driver.internal.value.MapValue;
import org.neo4j.driver.internal.value.NodeValue;
import org.neo4j.driver.internal.value.NullValue;
import org.neo4j.driver.internal.value.PathValue;
import org.neo4j.driver.internal.value.PointValue;
import org.neo4j.driver.internal.value.RelationshipValue;
import org.neo4j.driver.internal.value.StringValue;
import org.neo4j.driver.internal.value.TimeValue;
import org.neo4j.driver.v1.exceptions.ClientException;
Expand Down Expand Up @@ -91,6 +94,7 @@ public static Value value( Object value )
{
if ( value == null ) { return NullValue.NULL; }

assertParameter( value );
if ( value instanceof AsValue ) { return ((AsValue) value).asValue(); }
if ( value instanceof Boolean ) { return value( (boolean) value ); }
if ( value instanceof String ) { return value( (String) value ); }
Expand Down Expand Up @@ -381,7 +385,6 @@ public static Value parameters( Object... keysAndValues )
for ( int i = 0; i < keysAndValues.length; i += 2 )
{
Object value = keysAndValues[i + 1];
assertParameter( value );
map.put( keysAndValues[i].toString(), value( value ) );
}
return value( map );
Expand Down Expand Up @@ -666,15 +669,15 @@ public static <T> Function<Value,List<T>> ofList( final Function<Value,T> innerM

private static void assertParameter( Object value )
{
if ( value instanceof Node )
if ( value instanceof Node || value instanceof NodeValue )
{
throw new ClientException( "Nodes can't be used as parameters." );
}
if ( value instanceof Relationship )
if ( value instanceof Relationship || value instanceof RelationshipValue )
{
throw new ClientException( "Relationships can't be used as parameters." );
}
if ( value instanceof Path )
if ( value instanceof Path || value instanceof PathValue )
{
throw new ClientException( "Paths can't be used as parameters." );
}
Expand Down
81 changes: 81 additions & 0 deletions driver/src/test/java/org/neo4j/driver/internal/ValuesTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,18 @@
import org.neo4j.driver.internal.value.LocalDateTimeValue;
import org.neo4j.driver.internal.value.LocalTimeValue;
import org.neo4j.driver.internal.value.MapValue;
import org.neo4j.driver.internal.value.NodeValue;
import org.neo4j.driver.internal.value.PathValue;
import org.neo4j.driver.internal.value.RelationshipValue;
import org.neo4j.driver.internal.value.TimeValue;
import org.neo4j.driver.v1.Value;
import org.neo4j.driver.v1.Values;
import org.neo4j.driver.v1.exceptions.ClientException;
import org.neo4j.driver.v1.types.IsoDuration;
import org.neo4j.driver.v1.types.Node;
import org.neo4j.driver.v1.types.Path;
import org.neo4j.driver.v1.types.Point;
import org.neo4j.driver.v1.types.Relationship;

import static java.util.Arrays.asList;
import static org.hamcrest.CoreMatchers.equalTo;
Expand All @@ -60,6 +66,9 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertThat;
import static org.neo4j.driver.internal.util.ValueFactory.emptyNodeValue;
import static org.neo4j.driver.internal.util.ValueFactory.emptyRelationshipValue;
import static org.neo4j.driver.internal.util.ValueFactory.filledPathValue;
import static org.neo4j.driver.v1.Values.isoDuration;
import static org.neo4j.driver.v1.Values.ofDouble;
import static org.neo4j.driver.v1.Values.ofFloat;
Expand Down Expand Up @@ -483,4 +492,76 @@ public void shouldCreateValueFromPoint3D()
assertEquals( point3D, point3DValue2.asPoint() );
assertEquals( point3DValue1, point3DValue2 );
}

@Test
public void shouldComplainAboutNodeValueType() throws Throwable
{
// Expect
exception.expect( ClientException.class );
exception.expectMessage( "Nodes can't be used as parameters." );

// When
NodeValue node = emptyNodeValue();
value( node );
}

@Test
public void shouldComplainAboutNodeType() throws Throwable
{
// Expect
exception.expect( ClientException.class );
exception.expectMessage( "Nodes can't be used as parameters." );

// When
Node node = emptyNodeValue().asNode();
value( node );
}

@Test
public void shouldComplainAboutRelationshipValueType() throws Throwable
{
// Expect
exception.expect( ClientException.class );
exception.expectMessage( "Relationships can't be used as parameters." );

// When
RelationshipValue rel = emptyRelationshipValue();
value( rel );
}

@Test
public void shouldComplainAboutRelationshipType() throws Throwable
{
// Expect
exception.expect( ClientException.class );
exception.expectMessage( "Relationships can't be used as parameters." );

// When
Relationship rel = emptyRelationshipValue().asRelationship();
value( rel );
}

@Test
public void shouldComplainAboutPathValueType() throws Throwable
{
// Expect
exception.expect( ClientException.class );
exception.expectMessage( "Paths can't be used as parameters." );

// When
PathValue path = filledPathValue();
value( path );
}

@Test
public void shouldComplainAboutPathType() throws Throwable
{
// Expect
exception.expect( ClientException.class );
exception.expectMessage( "Paths can't be used as parameters." );

// When
Path path = filledPathValue().asPath();
value( path );
}
}
Loading