Skip to content

Instantly share code, notes, and snippets.

@komamitsu
Last active April 27, 2018 00:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save komamitsu/baa92b5dbd270f21938e55c97f00c350 to your computer and use it in GitHub Desktop.
Save komamitsu/baa92b5dbd270f21938e55c97f00c350 to your computer and use it in GitHub Desktop.
io.digdag.core.workflow.WorkflowExecutorTest#retryOnGroupingTask at jackson-2_8_11 branch
io.digdag.core.agent.OperatorManager#runWithWorkspace
Config localConfig = config.getFactory().create();
for (String localKey : request.getLocalConfig().getKeys()) {
>>> localConfig.set(localKey, config.getOptional(localKey, JsonNode.class).transform(JsonNode::deepCopy).orNull());
}
ex = {java.lang.ClassCastException@5548} "java.lang.ClassCastException: java.lang.String cannot be cast to com.fasterxml.jackson.databind.JsonNode"
detailMessage = "java.lang.String cannot be cast to com.fasterxml.jackson.databind.JsonNode"
cause = {java.lang.ClassCastException@5548} "java.lang.ClassCastException: java.lang.String cannot be cast to com.fasterxml.jackson.databind.JsonNode"
config: {"timezone":"UTC","session_uuid":"1e1dfd55-50ae-42e0-959f-9c79c963194d","session_time":"2018-04-21T15:45:38+00:00","session_id":1,"session_date":"2018-04-21","session_date_compact":"20180421","session_local_time":"2018-04-21 15:45:38","session_tz_offset":"+0000","session_unixtime":1524325538,"last_executed_session_time":"","last_executed_session_date":"","last_executed_session_date_compact":"","last_executed_session_local_time":"","last_executed_session_tz_offset":"+0000","last_executed_session_unixtime":"","project_id":1,"task_name":"+retry_on_group+first","_project_path":"/var/folders/1l/q_gkm3h1449478ywymjjlykm0000gn/T/junit4689296516790784527","echo>":"","append_file":"out","_type":"echo","_command":""}
localKey: "echo>"
io.digdag.client.config.Config#getOptional(java.lang.String, java.lang.Class<E>)
public <E> Optional<E> getOptional(String key, Class<E> type)
{
return (Optional<E>) get(key, mapper.getTypeFactory().constructType(new TypeReference<Optional<E>>() {}), Optional.<E>absent());
}
com.google.common.base.Present#transform
@Override
public <V> Optional<V> transform(Function<? super T, V> function) {
return new Present<V>(
checkNotNull(
>>> function.apply(reference),
"the Function passed to Optional.transform() must not return null."));
}
this = {com.google.common.base.Present@5512} "Optional.of()"
function = {io.digdag.core.agent.OperatorManager$$Lambda$192.149583493@5513}
reference = ""
Original:
public <E> Optional<E> getOptional(String key, Class<E> type)
{
return (Optional<E>) get(key, mapper.getTypeFactory().constructParametrizedType(Optional.class, Optional.class, type), Optional.<E>absent());
}
this = {io.digdag.client.config.Config@5369} "{"timezone":"UTC","session_uuid":"dce40627-f169-43dc-8528-a92661fb2b59","session_time":"2018-04-21T15:55:56+00:00","session_id":1,"session_date":"2018-04-21","session_date_compact":"20180421","session_local_time":"2018-04-21 15:55:56","session_tz_offset":"+0000","session_unixtime":1524326156,"last_executed_session_time":"","last_executed_session_date":"","last_executed_session_date_compact":"","last_executed_session_local_time":"","last_executed_session_tz_offset":"+0000","last_executed_session_unixtime":"","project_id":1,"task_name":"+retry_on_group+first","_project_path":"/var/folders/1l/q_gkm3h1449478ywymjjlykm0000gn/T/junit6976934775479679483","echo>":"","append_file":"out","_type":"echo","_command":""}"
key = "echo>"
type = {java.lang.Class@1044} "class com.fasterxml.jackson.databind.JsonNode"
this = {com.google.common.base.Present@5416} "Optional.of("")"
reference = {com.fasterxml.jackson.databind.node.TextNode@5418} """"
function = {io.digdag.core.agent.OperatorManager$$Lambda$191.1338934412@5417}
reference = {com.fasterxml.jackson.databind.node.TextNode@5418} """"
@komamitsu
Copy link
Author

        String json = "{\"s\": \"str\"}";
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new GuavaModule());
        JsonNode node = objectMapper.readTree(json);

        Optional<JsonNode> value = objectMapper.readValue(node.get("s").traverse(), objectMapper.getTypeFactory().constructType(new TypeReference<Optional<JsonNode>>() {}));
        System.out.println(value.transform(JsonNode::deepCopy));


valueType = {ReferenceType@894} "[reference type, class com.google.common.base.Optional<com.fasterxml.jackson.databind.JsonNode<[simple type, class com.fasterxml.jackson.databind.JsonNode]>]"
 _referencedType = {SimpleType@909} "[simple type, class com.fasterxml.jackson.databind.JsonNode]"
 _anchorType = {ReferenceType@894} "[reference type, class com.google.common.base.Optional<com.fasterxml.jackson.databind.JsonNode<[simple type, class com.fasterxml.jackson.databind.JsonNode]>]"
 _superClass = {SimpleType@910} "[simple type, class java.lang.Object]"
 _superInterfaces = {JavaType[1]@911} 
 _bindings = {TypeBindings@913} "<Lcom/fasterxml/jackson/databind/JsonNode;>"
 _canonicalName = null
 _class = {Class@914} "class com.google.common.base.Optional"
 _hash = 1576298722
 _valueHandler = null
 _typeHandler = null
 _asStatic = false
    @Test
    public void verifyOptional()
    {
        config.set("str", "s");

        Optional<JsonNode> optNode = config.getOptional("str", JsonNode.class);
        optNode.transform(JsonNode::asText);
        optNode.transform(JsonNode::deepCopy);
    }

valueType = {ReferenceType@1356} "[reference type, class com.google.common.base.Optional<java.lang.Object<[simple type, class java.lang.Object]>]"
 _referencedType = {SimpleType@1362} "[simple type, class java.lang.Object]"
  _superClass = null
  _superInterfaces = null
  _bindings = {TypeBindings@1381} "<>"
  _canonicalName = null
  _class = {Class@328} "class java.lang.Object"
  _hash = 1063877011
  _valueHandler = null
  _typeHandler = null
  _asStatic = false
 _anchorType = {ReferenceType@1356} "[reference type, class com.google.common.base.Optional<java.lang.Object<[simple type, class java.lang.Object]>]"
 _superClass = {SimpleType@1362} "[simple type, class java.lang.Object]"
 _superInterfaces = {JavaType[1]@1363} 
 _bindings = {TypeBindings@1365} "<Ljava/lang/Object;>"
 _canonicalName = null
 _class = {Class@1354} "class com.google.common.base.Optional"
  cachedConstructor = null
  newInstanceCallerCache = null
  name = "com.google.common.base.Optional"
  classLoader = {Launcher$AppClassLoader@1435} 
  reflectionData = null
  classRedefinedCount = 0
  genericInfo = {ClassRepository@1436} 
   superclass = {Class@328} "class java.lang.Object"
   superInterfaces = {Type[1]@1437} 
   typeParams = {TypeVariable[1]@1438} 
   factory = {CoreReflectionFactory@1440} 
   tree = {ClassSignature@1441} 
  enumConstants = null
  enumConstantDirectory = null
  annotationData = null
  annotationType = null
  classValueMap = null
 _hash = 1576298722
 _valueHandler = null
 _typeHandler = null
 _asStatic = false

@komamitsu
Copy link
Author

    public <E> Optional<E> getOptional(String key, Class<E> type)
    {
        JavaType javaType = mapper.getTypeFactory().constructType(type);
        return (Optional<E>) get(key, mapper.getTypeFactory().constructType(javaType), Optional.<E>absent());
    }

java.lang.ClassCastException: com.fasterxml.jackson.databind.node.TextNode cannot be cast to com.google.common.base.Optional

	at io.digdag.client.config.Config.getOptional(Config.java:287)
	at io.digdag.client.config.ConfigTest.verifyOptional(ConfigTest.java:172)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

@komamitsu
Copy link
Author

    private static <T> TypeReference<Optional<T>> getTypeReference(ObjectMapper objectMapper, Class<T> klazz)
    {
        return new TypeReference<Optional<T>>() {};
    }
typeReferenceViaMethod = {Hoge$1@898} 
 _type = {ParameterizedTypeImpl@901} "com.google.common.base.Optional<T>"
  actualTypeArguments = {Type[1]@905} 
   0 = {TypeVariableImpl@910} "T"
  rawType = {Class@906} "class com.google.common.base.Optional"
  ownerType = null
typeReferenceDirectly = {Hoge$2@899} 
 _type = {ParameterizedTypeImpl@903} "com.google.common.base.Optional<com.fasterxml.jackson.databind.JsonNode>"
  actualTypeArguments = {Type[1]@908} 
   0 = {Class@877} "class com.fasterxml.jackson.databind.JsonNode"
  rawType = {Class@906} "class com.google.common.base.Optional"
  ownerType = null

@komamitsu
Copy link
Author

    private static <T> Optional<T> getOptValue(ObjectMapper objectMapper, JsonParser jp, Class<T> clazz)
            throws IOException
    {
        return
                objectMapper.readValue(jp,
                        objectMapper.getTypeFactory().constructReferenceType(
                                Optional.class,
                                objectMapper.constructType(clazz)));
    }

        Optional<JsonNode> value = getOptValue(objectMapper, node.get("s").traverse(), JsonNode.class);
        System.out.println(value.transform(JsonNode::deepCopy));

@komamitsu
Copy link
Author

diff --git a/build.gradle b/build.gradle
index 08067f589..935529c08 100644
--- a/build.gradle
+++ b/build.gradle
@@ -110,6 +110,7 @@ subprojects {

     ext {
         jacksonVersion = "2.8.11"
+        jacksonVersionOld = "2.6.7"
         awsJavaSdkVersion = "1.11.63"
         guavaVersion = "19.0"
     }
diff --git a/digdag-core/build.gradle b/digdag-core/build.gradle
index f10ecf397..dbcf96667 100644
--- a/digdag-core/build.gradle
+++ b/digdag-core/build.gradle
@@ -10,7 +10,7 @@ dependencies {
     // https://github.com/FasterXML/jackson-modules-base/pull/22
     compile 'org.embulk:guice-bootstrap:0.2.1'

-    compile "com.fasterxml.jackson.module:jackson-module-guice:${project.ext.jacksonVersion}"
+    compile "com.fasterxml.jackson.module:jackson-module-guice:${project.ext.jacksonVersionOld}"
     compile "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${project.ext.jacksonVersion}"
     compile 'org.jdbi:jdbi:2.75'
     compile 'com.zaxxer:HikariCP:2.4.7'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment