Also I notice that there might be such situation: there is a  java list of 
elements, but instead of writing that this is a list type and it has 0 
elements, I just have 0.
Also for guid:  there can stand also only 0 without specifying that this is 
guid type. I am not sure that it is impossible to determine this type in 
runtime as previously in the same message I already had guid fields.

For the example that I sent, the last numbers correspond to the following:

14(TransactionScopeOption)|2(enum, =required)|
0(useCinderCommandCallback)| (bool)
0(vdsRunningOn, null, guid)| (Guid)
0(vdsmTaskIds)| (List)
0(first last bool param)|
0(second last bool param)| 



вторник, 23 октября 2018 г., 14:50:33 UTC+3 пользователь Thomas Broyer 
написал:
>
>
>
> 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