diff --git a/Polyglot-compatibility.md b/Polyglot-compatibility.md new file mode 100644 index 0000000..f401bbb --- /dev/null +++ b/Polyglot-compatibility.md @@ -0,0 +1,66 @@ +# Groovy compatibility + +## Isn't ANY Java library compatible with Groovy? + + Yes, of course. You can use j8583 in Groovy just as you would use any other Java library. However, + some j8583 classes have certain methods in them written specifically for usage within Groovy. + +### j8583 short-hand in Groovy + + In Java, you can deal with values in an IsoMessage like this: + +```java +message.setValue(32, "Some value", IsoType.LLVAR, 0); +IsoValue isoValue = message.getField(32); +String value = (String)message.getObjectValue(32); +Object value2 = message.getField(32).getValue(); +``` + + In Groovy you can do the same like this + +```groovy +message[32] = IsoType.LLVAR("Some value") +message[7] = IsoType.DATE10(new Date()) +message[41] = IsoType.ALPHA("Term", 16) +message[11] = IsoType.NUMERIC(123, 6) +IsoValue isoValue = message[32] +def value = message[32]?.value +``` + + This is because the `IsoMessage` class has get `getAt()` and `putAt()` methods that work similar + to `getField()` and `setField`, and the `IsoType` class has two `call()` methods, with and without + length, which return `IsoValue` instances with the proper type and length. The variant that has a length parameter + must be used with NUMERIC and ALPHA types, and the other types can use the variant without length. + +# Scala compatibility + + In a similar fashion, you can use a shorter notation in Scala to set and get fields: + +```scala +message(32) = IsoType.LLVAR("Some value") +message(7) = IsoType.DATE10(new Date()) +message(41) = IsoType.ALPHA("Term", 16) +message(11) = IsoType.NUMERIC(123, 6) +val v1:String = message(32).getValue +val v2:String = message.getObjectValue(32) +``` + + This is because IsoMessage also implements the `apply()` and `update()` methods that work similarly to `getField()` and `setField()`. Also, `IsoType` now implements `apply()` so that you can create IsoValues from IsoTypes. + +### Builder Pattern + + In any language, you can use the builder pattern, since now the `setValue` and `setField` methods return the message itself: + +```java +message.setValue(4, amount, IsoType.AMOUNT, 12) + .setValue(7, new Date(), IsoType.DATE, 10) + .setValue(11, trace, IsoType.NUMERIC, 6); +``` + + Of course it can be more succint in Groovy or Scala: + +```groovy +message.setField(4, IsoType.AMOUNT(amount)) + .setField(7, IsoType.DATE(new Date())) + .setField(11, IsoType.NUMERIC(trace, 6)) +```