On Tuesday, October 23, 2018 at 1:16:57 PM UTC+2, Anastasiya Ruzhanskaya 
wrote:
>
> Dear Thomas,
> thank you a lot for a detailed answer!
>
> I saw this documentation, but seems should look more thoroughly into 
> serialization inside GWT. 
>
> Concerning the numbers 0|5|0|0|0 - after VmOperationParameterBase class 
> where there is a private field vmId we move down to ActionParameterBase 
> class (as you said), so 0 here will correspond to the first parameter 
> inside this class in alphabetical order (seems commanId)? And five - to 
> some value or to a type of parameter? (sometimes it is not clear does the 
> payload mean the type or the value itself). There is a field there - 
> ActionType commandType; which has type 5.
>

>From the doc, if the declared type of the value is a primitive type or 
java.lang.String, then the value is used directly (for strings, 0 means 
null and all other values are indices in the string table); in all other 
cases (including "primitive wrapper types" such as java.lang.Boolean or 
java.lang.Integer), the value will always start with its runtime type (or 0 
if it's null).

Assuming we're looking at the correct version of the sources, we'll indeed 
find, in order, commandId as a null Guid, commandType as the first constant 
of the ActionType enum (type = 5 = ActionType, followed by 0 = ordinal in 
the enum). The next 2 '0' would be compensationEnabled as a boolean false, 
and correlationId as a null String, respectively.
Next would be endProcedure, as the the second (ordinal = 1) constant of the 
EndProcedure enum, i.e. PARENT_MANAGED; and so on and so on.

The one thing that's not clear in the doc, is how to interpret negative 
values for objects (in place of the type or 0 for null, to reference an 
already deserialized object). I suppose that you could put each object into 
an array, and you'd use the absolute value as a 1-based index in that array.
I see a -6 in the payload, but I have no idea at first glance whether it'll 
be a numeric value or a reference to an already-deserialized object. You 
have to go through the pipe-delimited fields one by one to know what each 
one means.
 

>
> вторник, 23 октября 2018 г., 13:26:06 UTC+3 пользователь Thomas Broyer 
> написал:
>>
>> On Tuesday, October 23, 2018 at 11:46:56 AM UTC+2, Anastasiya Ruzhanskaya 
>> wrote:
>>>
>>> Hello all!
>>> I am working with oVirt (which helps to manage virtual machines) project 
>>> and it uses GWT RPC protocol in it's communications.
>>> I want to parse messages in GWT RPC format which I get after deciphering 
>>> the traffic.
>>>
>>> I hope that even without being totally familiar with the ovirt project, 
>>> someone will be able to help me a little bit.
>>>
>>> I already separated it on some meaningful parts), numbers in braces just 
>>> help to make correspondence between payload and strings:
>>> 7|
>>> 0|
>>> 14|
>>> (1)https://engine.localdomain/ovirt-engine/webadmin/|  //URL
>>> (2)E8B2AD24442204349EF795039C3B87E5|   // policy name
>>> (3)org.ovirt.engine.ui.frontend.gwtservices.GenericApiGWTService| 
>>> //service interface
>>> (4)runMultipleActions| //name of the method
>>> (5)org.ovirt.engine.core.common.action.ActionType/12242454|, // type1
>>> (6)java.util.ArrayList/4159755760|, // type2
>>> (7)Z| // type3 (bool)
>>> (8)org.ovirt.engine.core.common.action.ShutdownVmParameters/1694554255| 
>>> // class which contains uuid of the virtual machine
>>> (9)org.ovirt.engine.core.compat.Guid/1992968158|
>>> (10)java.util.UUID/2940008275| // seems the uuid of the virtual machine)
>>>
>>> (11)org.ovirt.engine.core.common.action.ActionParametersBase$EndProcedure/1568822488|
>>> (12)java.util.Collections$EmptyMap/4174664486|
>>> (13)org.ovirt.engine.core.common.businessentities.VDSStatus/1938301532|
>>> (14)org.ovirt.engine.core.compat.TransactionScopeOption/1475850853|
>>> (the following is the payload separated and commented in places where I 
>>> can understand it)
>>> 1|
>>> 2|
>>> 3|
>>> 4|  
>>> 4|- 4 method parameters
>>> 5|- first type = ActionType
>>> 6|- second type = arraylist
>>> 7|- third type = boolean
>>> 7|- fourth type = boolean
>>> 5(actionType)|9 (shutdown)|
>>> 6(arrayList)|1(??)|
>>> 8 (shutdown vm parameters, list object)|1|0|0|0|(??)
>>> 9 (guid, ?)|10(UUID)|J$m4mk9wVi3|MjeP460Xkpb (vm 
>>> uuid)|0|5|0|0|0|11|1|0|6|0|0|0|0|0|0|12|0|-6|13|0|1|0|1|14|2|0|0|0|0|0|
>>>
>>>
>>> Until virtual machine uuid parameter it is kind of clear what is 
>>> happening, but I still wonder what do the parameters 1 and 0 mean in places 
>>> marked as (??). I understand, that there is a method called 
>>> runMultipleActions and it has four parameters. I found in source examples 
>>> of calling this method .Then I determine types of these parameters. Then 
>>> the type of action performed ( I shut down the machine). Then  there should 
>>> be an ArrayList, which contains several objects. I assume that 8(shutdown 
>>> vm parameters) should follow right after 6 (arraylist), but there a "1" 
>>> which I can't explain. Also I don't know what for are these four boolean 
>>> values (1|0|0|0) What do they mean? And how can I cope with the left 
>>> payload?
>>>
>>> This is the example of the call from ovirt source code:
>>>
>>> ArrayList<ActionParametersBase> parameters = new ArrayList<>();
>>> parameters.add(new ActionParametersBase());
>>> parameters.get(0).setCommandId(Guid.Empty);
>>> parameters.add(new ActionParametersBase());
>>> frontend.runMultipleAction(ActionType.AddLocalStorageDomain, parameters, 
>>> false, mockMultipleActionCallback,
>>>                 testState);
>>>
>>>
>>>
>>> Thank you in advance for any help!
>>>
>>>
>>> I know this is kind of specific for oVirt but probably there is 
>>> something more that I should know about parsing the messages ( in the 
>>> internet I found a couple of articles about this, which helped me to 
>>> understand the first part of the message).
>>>
>>
>> Fwiw, the GWT-RPC wire protocol is documented at 
>> https://docs.google.com/document/d/1eG0YocsYYbNAtivkLtcaiEE5IOF5u4LUol8-LL0TIKU/view
>>
>> The first value after the ArrayList runtime type is its length (see [1] 
>> and [2]). In this case, the list contains only one item.
>>
>> Then, according to the doc, the fields of the ShutdownVmParameters are 
>> serialized in alphabetical order, walking up the class hierarchy. So the 
>> first boolean would be ShutdownVmParameters#waitBeforeShutdown (boolean 
>> true), followed by StopVmParametersBase#stopReason (0 means null), 
>> then VmOperationParameterBase#quotaId (again a null), 
>> and VmOperationParameterBase#rerun (boolean false).
>> This is then followed by VmOperationParameterBase#vmId, which is a Guid, 
>> itself having a single field of type UUID, which is serialized as a pair of 
>> longs by a UUID_CustomFieldSerializer [3], as you correctly identified.
>> Following would be the ActionParametersBase [4] fields, followed by the 
>> last 2 method arguments.
>>
>> [1] 
>> https://github.com/gwtproject/gwt/blob/2.8.2/user/src/com/google/gwt/user/client/rpc/core/java/util/ArrayList_CustomFieldSerializerBase.java
>> [2] 
>> https://github.com/gwtproject/gwt/blob/2.8.2/user/src/com/google/gwt/user/client/rpc/core/java/util/Collection_CustomFieldSerializerBase.java
>> [3] 
>> https://github.com/oVirt/ovirt-engine/blob/60b63cf01dd46721afa269f1fbbc16d0ade2257b/frontend/webadmin/modules/gwt-extension/src/main/java/com/google/gwt/user/client/rpc/core/java/util/UUID_CustomFieldSerializer.java
>> [4] 
>> https://github.com/oVirt/ovirt-engine/blob/60b63cf01dd46721afa269f1fbbc16d0ade2257b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ActionParametersBase.java
>>
>>

-- 
You received this message because you are subscribed to the Google Groups "GWT 
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/d/optout.

Reply via email to