Lyndon Armitage created TINKERPOP-2094:
------------------------------------------

             Summary: Gremlin Driver Cluster Builder serializer method does not 
use mimeType as suggested
                 Key: TINKERPOP-2094
                 URL: https://issues.apache.org/jira/browse/TINKERPOP-2094
             Project: TinkerPop
          Issue Type: Bug
          Components: driver
    Affects Versions: 3.3.4
         Environment: Linux
Java 8
Kotlin
            Reporter: Lyndon Armitage


Whilst struggling with getting serialization working as expected during testing 
I noticed that the following method does not work as expected:

org.apache.tinkerpop.gremlin.driver.Cluster.Builder#serializer(java.lang.String)

Specifically this code: 
{code:java}
/**
 * Set the {@link MessageSerializer} to use given its MIME type.  Note that 
setting this value this way
 * will not allow specific configuration of the serializer itself.  If specific 
configuration is required
 * please use {@link #serializer(MessageSerializer)}.
 */
public Builder serializer(final String mimeType) {
    serializer = Serializers.valueOf(mimeType).simpleInstance();
    return this;
}
{code}
It suggests that the string argument being used should be a MIME type like 
"application/json" but due to how the method Serializers.valueOf() works it in 
fact checks the enum name value.

See the class org.apache.tinkerpop.gremlin.driver.ser.Serializers for some 
context.

The valueOf method checks against the name of the enum which for the 
"appliction/json" example would actually be "GRAPHSON".

There is a property called value and function called getValue() that were 
probably the intended targets for matching against.

A solution for this would be to simply check against each enum instance's value 
property via the getter method mentioned earlier. Something like this:
{code:java}
public Builder serializer(final String mimeType) {
    for (Serializers serializer : Serializers.values()) {
        if (serializer.getValue().equals(mimeType)) {
            this.serializer = serializer.simpleInstance();
            break;
        }
    }
    return this;
}
{code}
You could extract this (or the matching part of it) into a static method on the 
Serializers enum type if such a matching pattern is common. 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to