1
0
-1

Hi, I want comments to be sync only if they start with a specific string, something like 'TO_SYNC'.
Is it possible to do that with some kind of string comparison?

    CommentAdd your comment...

    2 answers

    1.  
      1
      0
      -1

      I did this in the replica site and it works:

      issue.comments = commentHelper.mergeComments(issue, replica,
      {
                             comment ->
                             comment.body =
                                comment.author.displayName +
                                        " commented: \n" +
                                comment.body.replaceAll("TO_SYNC", "") + "\n"
                          }
      )
      1. Francis Martens (Exalate)

        Excellent


        You do have the choice to replace the label on the source or the target.
        I would prefer to do it on the source, because it might be that you want to change that behaviour in the future.  Having this logic on the target creates a dependency which is more difficult to maintain.


        Anyway - thanks for finding a solution.

      2. Gabriele Centinaro

        Thanks for the suggestion, will look into it.

      CommentAdd your comment...
    2.  
      2
      1
      0

      Absolutely.

      In the outgoing sync. make sure that replica.comments only contain the comments which have 'TO_SYNC'

      Outgoing SYNC - Untested
      replica.comments = issue.comments.findAll { it.body.contains("TO_SYNC") }


      Give it a try

      1. Gabriele Centinaro

        Additional step, can I remove the "TO_SYNC" from the comment before synchronizing it?

      2. Francis Martens (Exalate)

        Yes you can 


        Outgoing Sync - Untested
        // filter out comments
        def transferComments = issue.comments.findAll { it.body.contains("TO_SYNC") }
        
        // remove the to_sync label from the body before sending it
        replica.comments = tranferComments.each { it.replaceAll("TO_SYNC", "") }
      3. Gabriele Centinaro

        The sync gives this error on the replaceAll part:

        • Impact: RELATION
        • Local entity: FLOR-29128
        • Remote entity: DMVAEPIC-61
        • Connection: Epic-DMVA_to_FLOR
        • Error type: Incoming script error
        • Error Creation Time: 2021-03-23 11:11:42.0
        • Error Detail Message: No signature of method: com.exalate.basic.domain.hubobject.v1.BasicHubComment.replaceAll() is applicable for argument types: (String, String) values: [TO_SYNC, ]
        • Error Stack Trace: com.exalate.api.exception.script.ScriptException: No signature of method: com.exalate.basic.domain.hubobject.v1.BasicHubComment.replaceAll() is applicable for argument types: (String, String) values: [TO_SYNC, ] at com.exalate.error.services.ScriptExceptionCategoryService.categorizeProcessorAndIssueTrackerExceptionsIntoScriptExceptions(ScriptExceptionCategoryService.scala:32) at com.exalate.processor.ExalateProcessor.executeProcessor(ExalateProcessor.java:47) at com.exalate.processor.jira.JiraCreateReplicaProcessor.executeDataFilter(JiraCreateReplicaProcessor.java:312) at com.exalate.processor.jira.JiraCreateReplicaProcessor.createHubReplica(JiraCreateReplicaProcessor.java:189) at com.exalate.replication.out.schedule.EventSchedulerService.scheduleSyncEvent(EventSchedulerService.java:848) at com.exalate.replication.out.schedule.EventSchedulerService.scheduleSyncEventNoLock(EventSchedulerService.java:739) at com.exalate.replication.out.schedule.EventSchedulerService.scheduleSyncEvents(EventSchedulerService.java:731) at com.exalate.replication.out.schedule.EventSchedulerServiceLockAware.lambda$scheduleSyncEvents$10(EventSchedulerServiceLockAware.java:227) at com.exalate.node.util.concurrent.ClusteredSensitiveExecutorService.executeHandlingLocks(ClusteredSensitiveExecutorService.java:54) at com.exalate.replication.out.schedule.EventSchedulerServiceLockAware.executeHandlingLocksForgetIfNotLocked(EventSchedulerServiceLockAware.java:247) at com.exalate.replication.out.schedule.EventSchedulerServiceLockAware.executeHandlingLocksForgetIfNotLocked(EventSchedulerServiceLockAware.java:236) at com.exalate.replication.out.schedule.EventSchedulerServiceLockAware.scheduleSyncEvents(EventSchedulerServiceLockAware.java:226) at com.exalate.replication.out.eventhandler.IssueEventHandlerService.scheduleDeleteOrUpdateEvents(IssueEventHandlerService.java:198) at com.exalate.replication.out.eventhandler.IssueEventHandlerService.handleEvent(IssueEventHandlerService.java:168) at com.exalate.replication.out.eventhandler.IssueEventHandlerService.handleIssueEvent(IssueEventHandlerService.java:132) at com.exalate.replication.out.eventhandler.IssueEventHandlerTask.run(IssueEventHandlerTask.java:43) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: javax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingMethodException: No signature of method: com.exalate.basic.domain.hubobject.v1.BasicHubComment.replaceAll() is applicable for argument types: (String, String) values: [TO_SYNC, ] at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:158) at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264) at com.exalate.processor.ExalateProcessor.execute(ExalateProcessor.java:72) at com.exalate.processor.ExalateProcessor.executeProcessor(ExalateProcessor.java:45) ... 21 more Caused by: javax.script.ScriptException: groovy.lang.MissingMethodException: No signature of method: com.exalate.basic.domain.hubobject.v1.BasicHubComment.replaceAll() is applicable for argument types: (String, String) values: [TO_SYNC, ] at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:320) at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:155) ... 24 more Caused by: groovy.lang.MissingMethodException: No signature of method: com.exalate.basic.domain.hubobject.v1.BasicHubComment.replaceAll() is applicable for argument types: (String, String) values: [TO_SYNC, ] at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:70) at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:46) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135) at Script182$_run_closure2.doCall(Script182.groovy:19) 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.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041) at groovy.lang.Closure.call(Closure.java:405) at groovy.lang.Closure.call(Closure.java:421) at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2330) at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2315) at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2356) at org.codehaus.groovy.runtime.dgm$186.invoke(Unknown Source) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:244) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127) at Script182.run(Script182.groovy:19) at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:317) ... 25 more
        • Incoming sync data:Summary:
              null

          Entity Key:
              null(id: null)

          Encoded payload:
            null


      4. Francis Martens (Exalate)

        Check out the error message

        com.exalate.basic.domain.hubobject.v1.BasicHubComment.replaceAll() is applicable for argument types: (String, String) values: [TO_SYNC, ]


        What is the object replaceAll is being applied on, and what should it be.

      5. Gabriele Centinaro

        I know, I tried the below option, the error goes away but the replace does not work, it transfers also the TO_SYNC part:

        replica.comments = transferComments.findAll { it.body.replaceAll("TO_SYNC", "") }

      6. Gabriele Centinaro

        Actually this is what I did but the replace does not work:

        :

        replica.comments = transferComments.each { it.body.replaceAll("TO_SYNC", "") }

      7. Francis Martens (Exalate)

        Ah 


        you need to return the object in your each closure like in


        replica.comments = transferComments.each {
        
             it.body.replaceAll("TO_SYNC", "") 
             it
        }


        (I'm doing this between meetings - so ymmv)

      8. Gabriele Centinaro

        I pasted the above but still it does not remove the TO_SYNC. Whenever you have time, thanks!

      9. Francis Martens (Exalate)

        Try this.  

        replica.comments = transferComments.each {
        
             it.body = it.body.replaceAll("TO_SYNC", "") 
             it
        }
      CommentAdd your comment...