<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 27, 2015 at 3:41 PM, Juan Hernández <span dir="ltr">&lt;<a href="mailto:jhernand@redhat.com" target="_blank">jhernand@redhat.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="">On 10/27/2015 03:05 PM, Roman Mohr wrote:<br>
&gt;<br>
&gt;<br>
&gt; On Tue, Oct 27, 2015 at 2:41 PM, Juan Hernández &lt;<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a><br>
</span><span class="">&gt; &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt; wrote:<br>
&gt;<br>
&gt;     On 10/27/2015 02:10 PM, Roman Mohr wrote:<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt; On Tue, Oct 27, 2015 at 1:45 PM, Juan Hernández &lt;<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
</span><span class="">&gt;     &gt; &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt; wrote:<br>
&gt;     &gt;<br>
&gt;     &gt;     On 10/27/2015 12:55 PM, Roman Mohr wrote:<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt; On Tue, Oct 27, 2015 at 12:16 PM, Juan Hernández &lt;<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
</span><span class="">&gt;     &gt;     &gt; &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;&gt; wrote:<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     On 10/27/2015 11:28 AM, Roman Mohr wrote:<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt; On Tue, Oct 27, 2015 at 10:47 AM, Juan Hernández &lt;<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;<br>
</span><span class="">&gt;     &gt;     &gt;     &gt; &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;&gt;&gt; wrote:<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     On 10/27/2015 10:16 AM, Roman Mohr wrote:<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; On Mon, Oct 26, 2015 at 5:32 PM, Juan Hernández &lt;<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;&gt;<br>
</span><span class="">&gt;     &gt;     &gt;     &gt;     &gt; &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;&gt;&gt;&gt; wrote:<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
</span><div><div class="h5">&gt;     &gt;     &gt;     &gt;     &gt;     On 10/26/2015 04:56 PM, Roman Mohr wrote:<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; Hi Juan,<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; The way to specify the contract look pretty<br>
&gt;     &gt;     clean and<br>
&gt;     &gt;     &gt;     nice.<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; I would love to read a few words about the big<br>
&gt;     &gt;     &gt;     picture. What<br>
&gt;     &gt;     &gt;     &gt;     is the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; final scenario?<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     The motivation for this change is that<br>
&gt;     currently we<br>
&gt;     &gt;     &gt;     don&#39;t have<br>
&gt;     &gt;     &gt;     &gt;     a central<br>
&gt;     &gt;     &gt;     &gt;     &gt;     place where the RESTAPI is specified, rather we<br>
&gt;     &gt;     have several<br>
&gt;     &gt;     &gt;     &gt;     different<br>
&gt;     &gt;     &gt;     &gt;     &gt;     places, using several different technologies:<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     * XML schema for the data model.<br>
&gt;     &gt;     &gt;     &gt;     &gt;     * JAX-RS for part of the operational model<br>
&gt;     &gt;     (without the<br>
&gt;     &gt;     &gt;     &gt;     parameters).<br>
&gt;     &gt;     &gt;     &gt;     &gt;     * rsdl_metadata.yaml for the parameters of the<br>
&gt;     &gt;     &gt;     operational model.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     This makes it difficult to infer information<br>
&gt;     about the<br>
&gt;     &gt;     &gt;     model. For<br>
&gt;     &gt;     &gt;     &gt;     &gt;     example, the generators of the SDKs have to<br>
&gt;     &gt;     download the XML<br>
&gt;     &gt;     &gt;     &gt;     schema, and<br>
&gt;     &gt;     &gt;     &gt;     &gt;     the RSDL (which is generated from the JAX-RS<br>
&gt;     &gt;     interfaces<br>
&gt;     &gt;     &gt;     using<br>
&gt;     &gt;     &gt;     &gt;     reflection<br>
&gt;     &gt;     &gt;     &gt;     &gt;     and combining it with the information from the<br>
&gt;     &gt;     &gt;     &gt;     rsdl_metadata.yaml file)<br>
&gt;     &gt;     &gt;     &gt;     &gt;     and then they have to do their own<br>
&gt;     computations to<br>
&gt;     &gt;     extract<br>
&gt;     &gt;     &gt;     &gt;     what they<br>
&gt;     &gt;     &gt;     &gt;     &gt;     need.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     Same happens with the CLI: it has to extract the<br>
&gt;     &gt;     information<br>
&gt;     &gt;     &gt;     &gt;     it needs<br>
&gt;     &gt;     &gt;     &gt;     &gt;     from the Python code generated for the<br>
&gt;     Python SDK, yet<br>
&gt;     &gt;     &gt;     another<br>
&gt;     &gt;     &gt;     &gt;     level of<br>
&gt;     &gt;     &gt;     &gt;     &gt;     indirection.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; You are right, that definitely needs to be<br>
&gt;     cleaned up. I<br>
&gt;     &gt;     &gt;     just want to<br>
&gt;     &gt;     &gt;     &gt;     &gt; discuss a few points below with you.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     We are also lacking a comprehensive reference<br>
&gt;     &gt;     &gt;     documentation of the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     RESTAPI. What we currently have has been<br>
&gt;     written by<br>
&gt;     &gt;     &gt;     hand, and<br>
&gt;     &gt;     &gt;     &gt;     gets out<br>
&gt;     &gt;     &gt;     &gt;     &gt;     of sync very quickly, and we don&#39;t even notice.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; Did you also consider swagger? It is made for<br>
&gt;     exactly that<br>
&gt;     &gt;     &gt;     purpose.<br>
&gt;     &gt;     &gt;     &gt;     &gt; I created a demo in [1] which uses resteasy, weld,<br>
&gt;     &gt;     &gt;     hibernate-validator<br>
&gt;     &gt;     &gt;     &gt;     &gt; and swagger to demonstrate how to do DRY with jaxrs.<br>
&gt;     &gt;     &gt;     &gt;     &gt; Would be great to hear you thoughts on that.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; And there is the great swagger-ui [8] to display the<br>
&gt;     &gt;     &gt;     documentation<br>
&gt;     &gt;     &gt;     &gt;     in a<br>
&gt;     &gt;     &gt;     &gt;     &gt; more human readable way.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     Yes, I considered Swagger, and rejected it because<br>
&gt;     it is<br>
&gt;     &gt;     JSON<br>
&gt;     &gt;     &gt;     centric,<br>
&gt;     &gt;     &gt;     &gt;     and I think JSON isn&#39;t as good as Java to<br>
&gt;     represent the<br>
&gt;     &gt;     &gt;     contracts of our<br>
&gt;     &gt;     &gt;     &gt;     RESTAPI.<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt; You just write plain jax-rs, swagger just creates a<br>
&gt;     &gt;     description out of<br>
&gt;     &gt;     &gt;     &gt; it. So  the source defining the contract is pure java<br>
&gt;     &gt;     (jax-rs with<br>
&gt;     &gt;     &gt;     some<br>
&gt;     &gt;     &gt;     &gt; swagger annotations for description, etc.).<br>
&gt;     &gt;     &gt;     &gt; Or am I missing the point here?<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     If I understand correctly the Swagger core is a JSON (or<br>
&gt;     YAML)<br>
&gt;     &gt;     &gt;     specification of the API. From that you can generate JAX-RS<br>
&gt;     &gt;     annotated<br>
&gt;     &gt;     &gt;     code, not the other way around. So the specification<br>
&gt;     document<br>
&gt;     &gt;     that you<br>
&gt;     &gt;     &gt;     write is a JSON document.<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt; You are right, my terminology here was not clear. Swagger is<br>
&gt;     just a<br>
&gt;     &gt;     &gt; specification. Swagger-core and swagger-jaxrs are the ones<br>
&gt;     which can<br>
&gt;     &gt;     &gt; create the documnetation out of JAX-RS resources.<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     Alternatively, you can use the Swagger annotations to<br>
&gt;     decorate<br>
&gt;     &gt;     your<br>
&gt;     &gt;     &gt;     implementation, both the entity classes and the JAX-RS<br>
&gt;     resource<br>
&gt;     &gt;     &gt;     implementations, and then extract the model from that.<br>
&gt;     But this is<br>
&gt;     &gt;     &gt;     putting the implementation before the specification. That is<br>
&gt;     &gt;     where we<br>
&gt;     &gt;     &gt;     are today, and it causes multiple problems. I think it is<br>
&gt;     &gt;     better to have<br>
&gt;     &gt;     &gt;     the specification and the implementation separate. Swagger<br>
&gt;     &gt;     does that<br>
&gt;     &gt;     &gt;     well when using JSON directly, our metamodel also does it<br>
&gt;     &gt;     well, but<br>
&gt;     &gt;     &gt;     using a better language.<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt; Isn&#39;t our problem that we have everything scattered arount the<br>
&gt;     &gt;     place and<br>
&gt;     &gt;     &gt; not that we are using JAX-RS? I don&#39;t think that this has<br>
&gt;     anything<br>
&gt;     &gt;     to do<br>
&gt;     &gt;     &gt; with specification before implementation or implementation<br>
&gt;     before<br>
&gt;     &gt;     &gt; specification.<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     Correct, the problem with the specification if that we don&#39;t<br>
&gt;     have one,<br>
&gt;     &gt;     just pieces of it scattered around, some in the XML schema,<br>
&gt;     some in the<br>
&gt;     &gt;     JAX-RS interfaces, some in the rsdl_metadata.yaml file.<br>
&gt;     &gt;<br>
&gt;     &gt;     This is historically related with the order of specification and<br>
&gt;     &gt;     implementation. When the project started we didn&#39;t create a<br>
&gt;     &gt;     specification of the RESTAPI, only an implementation, using<br>
&gt;     JAX-RS and<br>
&gt;     &gt;     XML schema. Then we added the rsdl_metadata.yaml file, and<br>
&gt;     extracted a<br>
&gt;     &gt;     specification from that, the RSDL. The result is hard to<br>
&gt;     consume. To<br>
&gt;     &gt;     make it easy to consume we need to reverse the order: first<br>
&gt;     &gt;     specification, free of implementation details, then<br>
&gt;     implementation.<br>
&gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     In addition we need to do these changes in a<br>
&gt;     smooth way, without causing<br>
&gt;     &gt;     &gt;     &gt;     big changes in the middle. For example, in the<br>
&gt;     first step we need to<br>
&gt;     &gt;     &gt;     &gt;     preserve the JAX-RS interfaces as they are today,<br>
&gt;     to avoid massive<br>
&gt;     &gt;     &gt;     &gt;     changes to all the resource implementations. This<br>
&gt;     could be done with<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     Swagger, but would require custom code generators.<br>
&gt;     With less effort we<br>
&gt;     &gt;     &gt;     &gt;     can do our own.<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt; This is of course generally a difficult task. But I do<br>
&gt;     not know why it<br>
&gt;     &gt;     &gt;     &gt; would be more difficult to write a custom swagger<br>
&gt;     reader (if we even<br>
&gt;     &gt;     &gt;     &gt; have to, it can read the interfaces as well) .<br>
&gt;     &gt;     &gt;     &gt; They are pretty streight forward. Just look at [9],<br>
&gt;     this contains the<br>
&gt;     &gt;     &gt;     &gt; wole jax-rs specific code to generate the swagger<br>
&gt;     documentation.<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt; But yes, I don&#39;t know every detail here of the engine<br>
&gt;     and can&#39;t clearly<br>
&gt;     &gt;     &gt;     &gt; say that integrating that would just streight forward<br>
&gt;     (my feeling tells<br>
&gt;     &gt;     &gt;     &gt; me that it would not be too hard). I am just under the<br>
&gt;     impression that<br>
&gt;     &gt;     &gt;     &gt; we would benefit from that. Just reduces custom magic<br>
&gt;     to a minimum.<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     Using something like Swagger would be certainly<br>
&gt;     possible, and not that<br>
&gt;     &gt;     &gt;     hard, but it requires an effort. For example, say that<br>
&gt;     we decide to use<br>
&gt;     &gt;     &gt;     the Swagger annotations. Then we will need to add these<br>
&gt;     annotations to<br>
&gt;     &gt;     &gt;     all our JAX-RS resource implementations. That is a non<br>
&gt;     trivial effort.<br>
&gt;     &gt;     &gt;     We would need to add the annotations to the entities as<br>
&gt;     well. But wait,<br>
&gt;     &gt;     &gt;     we don&#39;t have such entities, only XML schema. So we<br>
&gt;     would need a reader<br>
&gt;     &gt;     &gt;     that parses XML schema, and creating it requires effort.<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt; You can just create the entities/daos once like we do now on<br>
&gt;     every build<br>
&gt;     &gt;     &gt; and annotate them once and drop the whole xml.<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     The DAOs aren&#39;t part of the RESTAPI. The backend entities<br>
&gt;     aren&#39;t either.<br>
&gt;     &gt;     The RESTAPI has its own entities which are currently generated<br>
&gt;     from XML<br>
&gt;     &gt;     schema.<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt; s/DAOs/DTOs I meant Data transfer object, not Data Access objects. And<br>
&gt;     &gt; they are generated.<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     Where do we put<br>
&gt;     &gt;     &gt;     the documentation then? Part in the JAX-RS interfaces,<br>
&gt;     part in the XML<br>
&gt;     &gt;     &gt;     schema.<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt; I don&#39;t understand that. There is only one documentation and<br>
&gt;     &gt;     &gt; implementation source, that is the JAX-RS resource and the<br>
&gt;     entity/dao<br>
&gt;     &gt;     &gt; accepted by the endpoint.<br>
&gt;     &gt;     &gt; The XML schema can just be removed. The documentation in<br>
&gt;     swagger format<br>
&gt;     &gt;     &gt; for other tools like swagger-codegen and swagger-ci can be made<br>
&gt;     &gt;     &gt; available through swagger-maven-plugin or a servlet in the<br>
&gt;     engine which<br>
&gt;     &gt;     &gt; generates the swagger json on the fly (like I did in [1])<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     Those are two: JAX-RS and entities, and they are<br>
&gt;     implementations, not<br>
&gt;     &gt;     specifications.<br>
&gt;     &gt;<br>
&gt;     &gt;     The XML schema can&#39;t be drop, as many clients use it. But we can<br>
&gt;     &gt;     generate it from the model, and that is what we will do.<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt; Did not look into that.<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     We are already there, and we ended up with no<br>
&gt;     documentation at<br>
&gt;     &gt;     &gt;     all. In my view the sum of these efforts is higher than<br>
&gt;     doing<br>
&gt;     &gt;     our own<br>
&gt;     &gt;     &gt;     metamodel.<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     Swagger UI is certainly great. I did test it and it is<br>
&gt;     &gt;     really<br>
&gt;     &gt;     &gt;     good. We<br>
&gt;     &gt;     &gt;     &gt;     may be able to copy some concepts.<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     To solve these issues I intend to have the<br>
&gt;     &gt;     specification of<br>
&gt;     &gt;     &gt;     &gt;     the RESTAPI<br>
&gt;     &gt;     &gt;     &gt;     &gt;     only in one place, and using only one<br>
&gt;     technology. I<br>
&gt;     &gt;     &gt;     decided to<br>
&gt;     &gt;     &gt;     &gt;     use Java<br>
&gt;     &gt;     &gt;     &gt;     &gt;     interfaces for that. Note however that they are<br>
&gt;     &gt;     just the<br>
&gt;     &gt;     &gt;     &gt;     support for the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     information, like paper is the support for<br>
&gt;     ink. I<br>
&gt;     &gt;     decided to<br>
&gt;     &gt;     &gt;     &gt;     use Java<br>
&gt;     &gt;     &gt;     &gt;     &gt;     because it is easy to create, modify and<br>
&gt;     re-factor<br>
&gt;     &gt;     using<br>
&gt;     &gt;     &gt;     tools<br>
&gt;     &gt;     &gt;     &gt;     familiar<br>
&gt;     &gt;     &gt;     &gt;     &gt;     to most of us.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     These source of these interfaces is analysed<br>
&gt;     &gt;     (using QDox,<br>
&gt;     &gt;     &gt;     &gt;     currently) and<br>
&gt;     &gt;     &gt;     &gt;     &gt;     a &quot;model&quot; of the RESTAPI is generated in<br>
&gt;     memory. This<br>
&gt;     &gt;     &gt;     model is<br>
&gt;     &gt;     &gt;     &gt;     &gt;     independent of the supporting Java source,<br>
&gt;     and easy to<br>
&gt;     &gt;     &gt;     &gt;     consume. For<br>
&gt;     &gt;     &gt;     &gt;     &gt;     example, imagine that you want to list all<br>
&gt;     the types<br>
&gt;     &gt;     &gt;     available<br>
&gt;     &gt;     &gt;     &gt;     in the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     model and for each one display its<br>
&gt;     documentation:<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;       Model model = ...;<br>
&gt;     &gt;     &gt;     &gt;     &gt;       for (Type type : model.getTypes()) {<br>
&gt;     &gt;     &gt;     &gt;     &gt;         Name name = type.getName();<br>
&gt;     &gt;     &gt;     &gt;     &gt;         String doc = type.getDoc();<br>
&gt;     &gt;     &gt;     &gt;     &gt;         System.out.println(name + &quot;: &quot; + doc);<br>
&gt;     &gt;     &gt;     &gt;     &gt;       }<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     Something like this, but more elaborate, will be<br>
&gt;     &gt;     part of<br>
&gt;     &gt;     &gt;     a web<br>
&gt;     &gt;     &gt;     &gt;     &gt;     application that provides comprehensive<br>
&gt;     reference<br>
&gt;     &gt;     &gt;     documentation,<br>
&gt;     &gt;     &gt;     &gt;     &gt;     assuming that we dedicate the time to write<br>
&gt;     &gt;     documentation<br>
&gt;     &gt;     &gt;     &gt;     comments in<br>
&gt;     &gt;     &gt;     &gt;     &gt;     the specification.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     I intend to use this model also to do<br>
&gt;     simplify the<br>
&gt;     &gt;     &gt;     generators<br>
&gt;     &gt;     &gt;     &gt;     of the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     SDKs and the CLI.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     In addition these are some of the things<br>
&gt;     that I would<br>
&gt;     &gt;     &gt;     like to<br>
&gt;     &gt;     &gt;     &gt;     change in<br>
&gt;     &gt;     &gt;     &gt;     &gt;     the near future (for 4.0):<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     * Move the specification of the parameters of<br>
&gt;     &gt;     operations out<br>
&gt;     &gt;     &gt;     &gt;     of the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     rsdl_metadata.yaml file and into the model. For<br>
&gt;     &gt;     example:<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;       @Service<br>
&gt;     &gt;     &gt;     &gt;     &gt;       public VmService {<br>
&gt;     &gt;     &gt;     &gt;     &gt;         /**<br>
&gt;     &gt;     &gt;     &gt;     &gt;          * The operation to add a virtual machine.<br>
&gt;     &gt;     &gt;     &gt;     &gt;          */<br>
&gt;     &gt;     &gt;     &gt;     &gt;         interface Add {<br>
&gt;     &gt;     &gt;     &gt;     &gt;           /**<br>
&gt;     &gt;     &gt;     &gt;     &gt;            * The representation of the virtual<br>
&gt;     machine is<br>
&gt;     &gt;     &gt;     received<br>
&gt;     &gt;     &gt;     &gt;     &gt;            * as parameter, and the representation of<br>
&gt;     &gt;     the created<br>
&gt;     &gt;     &gt;     &gt;     &gt;            * virtual machine is returned as result.<br>
&gt;     &gt;     &gt;     &gt;     &gt;            */<br>
&gt;     &gt;     &gt;     &gt;     &gt;            @In @Out Vm vm();<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;            /**<br>
&gt;     &gt;     &gt;     &gt;     &gt;             * In the future, we will be able to<br>
&gt;     &gt;     specify other<br>
&gt;     &gt;     &gt;     &gt;     &gt;             * parameters here.<br>
&gt;     &gt;     &gt;     &gt;     &gt;             */<br>
&gt;     &gt;     &gt;     &gt;     &gt;            @In Boolean force();<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;            /**<br>
&gt;     &gt;     &gt;     &gt;     &gt;             * Even with default values.<br>
&gt;     &gt;     &gt;     &gt;     &gt;             */<br>
&gt;     &gt;     &gt;     &gt;     &gt;            @In default Boolean force() { return<br>
&gt;     true; }<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;            /**<br>
&gt;     &gt;     &gt;     &gt;     &gt;             * And we will be able to specify<br>
&gt;     &gt;     constraints, which<br>
&gt;     &gt;     &gt;     &gt;     &gt;             * will replace the<br>
&gt;     rsdl_metadata.yaml file.<br>
&gt;     &gt;     &gt;     &gt;     &gt;             */<br>
&gt;     &gt;     &gt;     &gt;     &gt;            @Constraint<br>
&gt;     &gt;     &gt;     &gt;     &gt;            default boolean vmNameMustNotBeNull() {<br>
&gt;     &gt;     &gt;     &gt;     &gt;              return vm().name() != null;<br>
&gt;     &gt;     &gt;     &gt;     &gt;            }<br>
&gt;     &gt;     &gt;     &gt;     &gt;          }<br>
&gt;     &gt;     &gt;     &gt;     &gt;       }<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     * Enforce the constraints automatically. If the<br>
&gt;     &gt;     constraints<br>
&gt;     &gt;     &gt;     &gt;     are in the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     model, then we can just check them and<br>
&gt;     reject requests<br>
&gt;     &gt;     &gt;     before<br>
&gt;     &gt;     &gt;     &gt;     delivering<br>
&gt;     &gt;     &gt;     &gt;     &gt;     them to the application. Currently we do<br>
&gt;     this manually<br>
&gt;     &gt;     &gt;     (and often<br>
&gt;     &gt;     &gt;     &gt;     &gt;     forget) with calls to &quot;validate(...)&quot; methods.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; Did you consider just annotating the DTOs with<br>
&gt;     JSR-303<br>
&gt;     &gt;     &gt;     annotations and<br>
&gt;     &gt;     &gt;     &gt;     &gt; integrate a validator with jax-rs?<br>
&gt;     &gt;     &gt;     &gt;     &gt; See [2] for an example.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     This is a great way to implement a system, but the<br>
&gt;     goal here<br>
&gt;     &gt;     &gt;     isn&#39;t to<br>
&gt;     &gt;     &gt;     &gt;     implement it, rather to specify it. Using<br>
&gt;     annotations in<br>
&gt;     &gt;     this<br>
&gt;     &gt;     &gt;     way won&#39;t<br>
&gt;     &gt;     &gt;     &gt;     help the generators of the SDKs, for example, to<br>
&gt;     figure<br>
&gt;     &gt;     out what<br>
&gt;     &gt;     &gt;     &gt;     parameters are required, mandatory, etc.<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt; Swagger understands them. From my example project, swagger<br>
&gt;     &gt;     created<br>
&gt;     &gt;     &gt;     that<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;      description:<br>
&gt;     &gt;     &gt;     &gt;         type: &quot;string&quot;<br>
&gt;     &gt;     &gt;     &gt;         minLength: 10<br>
&gt;     &gt;     &gt;     &gt;         maxLength: 100<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt; out of<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;      @Size(min=10, max=100) # jsr-303<br>
&gt;     &gt;     &gt;     &gt;      private String description;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt; and so does swagger-codegen which can generate clients<br>
&gt;     in java,<br>
&gt;     &gt;     &gt;     python, ...<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     This is extracting the specification from the<br>
&gt;     implementation,<br>
&gt;     &gt;     which<br>
&gt;     &gt;     &gt;     isn&#39;t correct in my opinion, it should be the opposite. Not<br>
&gt;     &gt;     saying that<br>
&gt;     &gt;     &gt;     this makes Swagger bad, it is nice that it has this<br>
&gt;     &gt;     capability, but I<br>
&gt;     &gt;     &gt;     think we can do it better.<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt; In my opition this is the main advantage of that. It is DRY<br>
&gt;     while<br>
&gt;     &gt;     still<br>
&gt;     &gt;     &gt; having full control of the implementation.<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     I think that DRY is better served if you write the<br>
&gt;     specification once,<br>
&gt;     &gt;     and then, from that, you generate the contracts (interfaces,<br>
&gt;     entities,<br>
&gt;     &gt;     builders, etc) that the implementation should use.<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt; And how do you add special things like @Gzip or other specializations<br>
&gt;     &gt; which you might use?<br>
&gt;     &gt;<br>
&gt;<br>
&gt;     There shouldn&#39;t be any specialization. All the RESTAPI services should<br>
&gt;     behave exactly the same. So if one of them supports GZIP, for example,<br>
&gt;     then all of the should do.<br>
&gt;<br>
&gt;     Anyhow, if there is a real need for a specialization it can go into the<br>
&gt;     implementation, it isn&#39;t a problem.<br>
&gt;<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     * Generate the Java classes directly from the<br>
&gt;     &gt;     model. Instead of Model -&gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     XML Schema -&gt; Java, we can do Model -&gt; Java.<br>
&gt;     This<br>
&gt;     &gt;     will allow us to solve<br>
&gt;     &gt;     &gt;     &gt;     &gt;     some of the XJC compiler limitations, like the<br>
&gt;     &gt;     horrible way we handle<br>
&gt;     &gt;     &gt;     &gt;     &gt;     arrays today.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; Swagger [3] is a rest documentation specification.<br>
&gt;     &gt;     There is also a maven<br>
&gt;     &gt;     &gt;     &gt;     &gt; plugin [4] and you can create clients for<br>
&gt;     example with<br>
&gt;     &gt;     [5].<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     * Replace JAX-RS with a simpler infrastructure<br>
&gt;     &gt;     that supports better<br>
&gt;     &gt;     &gt;     &gt;     &gt;     streaming and CDI injection.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; With resteasy-cdi you have pretty good injection<br>
&gt;     &gt;     support for resteasy.<br>
&gt;     &gt;     &gt;     &gt;     &gt; Run the demo in [1] to see it in action and look at<br>
&gt;     &gt;     the file at [6].<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     Resteasy-CDI isn&#39;t standard, it only works with<br>
&gt;     &gt;     Resteasy. If we rely on<br>
&gt;     &gt;     &gt;     &gt;     it then we re tied to Resteasy for ever.<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt; Even jersey has support for that (I think it is called<br>
&gt;     &gt;     jeryse-gf-cdi),<br>
&gt;     &gt;     &gt;     &gt; but why would we want switch? I don&#39;t think that jboss<br>
&gt;     will drop<br>
&gt;     &gt;     &gt;     &gt; resteasy and it also works fine outside of full blown<br>
&gt;     &gt;     containers. I<br>
&gt;     &gt;     &gt;     &gt; don&#39;t think that this is an argument.<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     Well, nobody thought that JBoss would drop Tomcat, and they<br>
&gt;     &gt;     did. Nobody<br>
&gt;     &gt;     &gt;     thought that Resteasy would change the SPI from 2.x to 3.x,<br>
&gt;     &gt;     and they<br>
&gt;     &gt;     &gt;     did.\<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt; It will be there for the next year or another library which<br>
&gt;     offers the<br>
&gt;     &gt;     &gt; same thing. Having injections in Jax-rs resources is<br>
&gt;     important for<br>
&gt;     &gt;     &gt; spring, jboss, glassfish and others there will always be<br>
&gt;     ways to do<br>
&gt;     &gt;     &gt; that. I don&#39;t know why we should create our own &#39;custom<br>
&gt;     standard&#39; just<br>
&gt;     &gt;     &gt; because another standard does not include dependency<br>
&gt;     injection when we<br>
&gt;     &gt;     &gt; can just extend it so easily.<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     Here our views of &quot;easily&quot; are different. I have suffered the<br>
&gt;     problems<br>
&gt;     &gt;     with changes in Resteasy over the past years, and I won&#39;t<br>
&gt;     describe it as<br>
&gt;     &gt;     easy.<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt; I agree. Maven and dependencies are never easy. But I prefer to fix<br>
&gt;     &gt; something now and then on regular maven dependency updates than being<br>
&gt;     &gt; tied to somesing because of a custom code generator.<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     We want (well, I want) to get out of JAX-RS because it<br>
&gt;     doesn&#39;t support<br>
&gt;     &gt;     &gt;     well CDI and streaming.<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt; Why should streaming resources be in the rest interface?<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     Streaming should be used not only in the RESTAPI, but in the<br>
&gt;     complete<br>
&gt;     &gt;     system, including the backend and the DAL, otherwise we have<br>
&gt;     serious<br>
&gt;     &gt;     problems when clients requests large amounts of objects.<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt; Streaming is no solution here. It does not address the problem at all.<br>
&gt;     &gt; Solving the database bottleneck with this approach is just wrong.<br>
&gt;     &gt; A client can iterate over our 10000 VMs extremely fast. No matter if<br>
&gt;     &gt; streamed or not, so this will still hit the database.<br>
&gt;     &gt;<br>
&gt;<br>
&gt;     Streaming is a mechanism to improve the latency when serving multiple<br>
&gt;     objects: instead of having your client waiting till you have all the<br>
&gt;     requested objects (10 or 10K) in memory you send them as soon as you<br>
&gt;     can.<br>
&gt;<br>
&gt;<br>
&gt; 1) you would still fetch everything in batches from the database to<br>
&gt; reduce the database load<br>
<br>
</div></div>Correct, the database would also work better if the DAL retrieved things<br>
using a streaming approach, but that is out of the scope of the RESTAPI.<br>
<span class=""><br>
&gt; 2) the latency regarding to jax-rs is almost zero. We have bugs like<br>
&gt; <a href="https://bugzilla.redhat.com/show_bug.cgi?id=1268224" rel="noreferrer" target="_blank">https://bugzilla.redhat.com/show_bug.cgi?id=1268224</a>. You would not see a<br>
&gt; human noticable improvement regarding to latency. Even if they would be<br>
&gt; fixed (well yes the first vms would drop out faster, but the over all<br>
&gt; execution time might even be worse, that depends on the underlying<br>
&gt; database fetches).<br>
&gt;<br>
<br>
</span>Indeed, issues like the one described in that bug also need to be fixed.<br>
Streaming results isn&#39;t the solution for all problems, just one<br>
ingredient of the overall solution, caching being another important one.<br>
<span class=""></span> </blockquote><div><br></div><div><br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="">
&gt;<br>
&gt;     In addition it also reduces the use of memory in the server.<br>
&gt;<br>
&gt; Which is absolutely not an issue for the engine. We can have the whole<br>
&gt; database in memory and we would still not need much memory for that. And<br>
&gt; that is why second level caches have eviction strategies.<br>
&gt;<br>
<br>
</span>We don&#39;t have a huge database, so we already have the whole database in<br>
memory, inside the database server caches. Why aren&#39;t we faster then?</blockquote><br></div><div class="gmail_quote">You can&#39;t seriously compare the database cache with an appliation specific second level cache and/or clean batching (we don&#39;t have both at the moment).<br></div><div class="gmail_quote">Querying the datbase with small statements thousands of times to fetch a few VMs or hosts obviously has a huge latency effect.<br>That is what I meant that streaming would not improve that situation at all. Everything before the streaming interface would have to deal with batches to be efficient when it has to do something with the database.<br></div><div class="gmail_quote"><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> Is<br>
the latency of the communications between the engine and the database<br>
server related?<br></blockquote><div><br></div><div>What do you mean by that? The latency is just always there and you work around that by batching and caches.<br></div><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Using less resources is almost always good, even if you have plenty of<br>
them. For example, it is good if you can return 1000 VMs using 1 KiB of<br>
RAM instead of 1 GiB: less CPU cache misses, less context switches, less<br>
work for the garbage collector, thus faster and less power hungry systems.<br>
</blockquote><div><div><br>We are in the fortunate position that we could have almost everything
 in a cache, something which is not always possible. Of course that does
 not mean that we have to.<br></div>And using caches to not hit the database is also good.<br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="">
&gt;<br>
&gt;     Think about watching a movie. What is better, downloading it complete<br>
&gt;     and the watch it, or watch as the individual frames arrive?<br>
&gt;<br>
&gt;     &gt; What you normally do to prevent this:<br>
&gt;     &gt;<br>
&gt;     &gt;  1) A second level cache (see here for a start<br>
&gt;     &gt; <a href="https://gerrit.ovirt.org/#/q/status:open+project:ovirt-engine+branch:master+topic:cache" rel="noreferrer" target="_blank">https://gerrit.ovirt.org/#/q/status:open+project:ovirt-engine+branch:master+topic:cache</a>)<br>
&gt;<br>
&gt;     Second level cache doesn&#39;t solve the latency problem. If someone<br>
&gt;     requests 1000 VMs he will still have to wait till you have the 1000 VMs<br>
&gt;     arranged in memory before sending them.<br>
&gt;<br>
&gt; You are right, it does not reduce serialzation latency, but latency<br>
&gt; because of the REST api serialization will never be a problem here. It<br>
&gt; will always be our implementation which is the problem. With and without<br>
&gt; streams.<br>
&gt;<br>
<br>
</span>Correct, if the RESTAPI has to wait doing nothing while other components<br>
prepare all the results then there is no value in streaming, that is why<br>
all the components should work in an streaming fashion.<br></blockquote><div><br></div><div>As I said, does not work with relational databases, only works with with notification queues. You would just translate the batched (paged) stuff and the streaming response.<br></div><div>If as a matter of taste you prefer streams over paging well that is fine but the serialization overhead with paging is negligible.<br></div><div>But I would not ignore good frameworks and well established best practices and create custom implementations just because of personal preferences.<br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div class=""><div class="h5"><br>
&gt;     &gt;  2) Add paging to the rest interface and define a maximum number per<br>
&gt;     &gt; page (would you trottle the stream in your approach per session, request?)<br>
&gt;     &gt;<br>
&gt;     &gt; The client then just happily fetch one page after the other without<br>
&gt;     &gt; thinking about overloading your system (but of course the client can<br>
&gt;     &gt; still deliberately harm you), because a client can assume that you<br>
&gt;     &gt; optimize your application (caches, daos and database and page size per<br>
&gt;     &gt; request) for that.<br>
&gt;     &gt;<br>
&gt;<br>
&gt;     The RESTAPI already has a pagination mechanism, but some clients don&#39;t<br>
&gt;     want to use it. We used to have a hard limit and we had to remove it.<br>
&gt;<br>
&gt; I cant&#39;t argue with that. That is definitely an interesting fact.<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;     &gt; Of course for notifications streams are great, but again why should they<br>
&gt;     &gt; be in the rest interface? Adding websockets or other stuff to listen on<br>
&gt;     &gt; changed VMs would be great. Just discussed this recently with rgolan.<br>
&gt;     &gt;<br>
&gt;<br>
&gt;     Notifications are currently out of the scope of the RESTAPI, and there<br>
&gt;     are no plans to add them.<br>
&gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     Think, for example, that a client requests 100 virtual machines. What we<br>
&gt;     &gt;     currently do is the following:<br>
&gt;     &gt;<br>
&gt;     &gt;     * The DAL requests the 100 rows to the database, and waits till the 100<br>
&gt;     &gt;     rows are loaded in memory (this is how the JDBC driver works by<br>
&gt;     &gt;     default). Only when the 100 rows are in memory the are converted to<br>
&gt;     &gt;     backend objects.<br>
&gt;     &gt;<br>
&gt;     &gt;     * The DAL returns the 100 backend objects to the BLL, which processes<br>
&gt;     &gt;     them. Only when they are all processed they are returned to the RESTAPI,<br>
&gt;     &gt;     as a list.<br>
&gt;     &gt;<br>
&gt;     &gt;     * The RESTAPI transforms the 100 backend objects into RESTAPI objects.<br>
&gt;     &gt;     Only when the are all transformed they are returned by the corresponding<br>
&gt;     &gt;     JAX-RS method to the JAX-RS infrastructure. This is encouraged by the<br>
&gt;     &gt;     high level interface of JAX-RS, as it encourages you to write methods<br>
&gt;     &gt;     like this:<br>
&gt;     &gt;<br>
&gt;     &gt;       @GET<br>
&gt;     &gt;       Vms get()<br>
&gt;     &gt;<br>
&gt;     &gt; Who could ever have thought that this can be a good idea. :D<br>
&gt;     &gt; I would go with paging instead of streams for that purpose (just make<br>
&gt;     &gt; sure to sort the returned values repeatable).<br>
&gt;     &gt;<br>
&gt;<br>
&gt;     This is just what JAX-RS encourages.<br>
&gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     * Once the JAX-RS infrastructure has the complete result it starts to<br>
&gt;     &gt;     convert it to the XML (or JSON) document.<br>
&gt;     &gt;<br>
&gt;     &gt;     Same for the reverse direction.<br>
&gt;     &gt;<br>
&gt;     &gt;     Put 10K virtual machines instead of just 100 and you see the problem.<br>
&gt;     &gt;<br>
&gt;     &gt;     Of course one could use JAX-RS in a way that doesn&#39;t have this problem,<br>
&gt;     &gt;     it is certainly possible, you can get the output stream and serialize<br>
&gt;     &gt;     the result from the resource implementation, in a an streaming fashion.<br>
&gt;     &gt;     But then the value of JAX-RS is reduced, you can do the same with a<br>
&gt;     &gt;     simpler servlet architecture. That is what I plan to do.<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt; Exactly my point. I would do monitoring stuff with different simple<br>
&gt;     &gt; stream servlets.<br>
&gt;     &gt;<br>
&gt;<br>
&gt;     Yes, servlet technology is enough and better for that, and for serving<br>
&gt;     the RESTAPI content as well.<br>
&gt;<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     * Add support for multiple versions of the<br>
&gt;     API, using<br>
&gt;     &gt;     &gt;     the &quot;Version&quot;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     header, and generating different Java<br>
&gt;     classes for<br>
&gt;     &gt;     &gt;     entities and services.<br>
&gt;     &gt;     &gt;     &gt;     &gt;     For example, if we have versions 4 and 5 of the<br>
&gt;     &gt;     model as<br>
&gt;     &gt;     &gt;     separate<br>
&gt;     &gt;     &gt;     &gt;     &gt;     artifacts, then we can generate &quot;V4Vm&quot; and<br>
&gt;     &quot;V5Vm&quot;<br>
&gt;     &gt;     entity<br>
&gt;     &gt;     &gt;     classes, and<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &quot;V4VmService&quot; and &quot;V5VmService&quot; service<br>
&gt;     classes. These<br>
&gt;     &gt;     &gt;     can be used<br>
&gt;     &gt;     &gt;     &gt;     &gt;     simultaneously in the server, so we can have in<br>
&gt;     &gt;     the same<br>
&gt;     &gt;     &gt;     engine<br>
&gt;     &gt;     &gt;     &gt;     &gt;     implementations for multiple versions.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; There are also many ways to do that. Here [7] is<br>
&gt;     a pretty<br>
&gt;     &gt;     &gt;     clean way to<br>
&gt;     &gt;     &gt;     &gt;     &gt; do it with jax-rs and you will have everything<br>
&gt;     related in<br>
&gt;     &gt;     &gt;     one resource.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     Yes, there are many ways. In my opinion it is<br>
&gt;     better to use<br>
&gt;     &gt;     &gt;     the HTTP<br>
&gt;     &gt;     &gt;     &gt;     &quot;Version&quot; header, and to forward requests to different<br>
&gt;     &gt;     resource<br>
&gt;     &gt;     &gt;     &gt;     implementations without requiring different URLs or<br>
&gt;     &gt;     different<br>
&gt;     &gt;     &gt;     &gt;     content types.<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt; Have no strong opinion there, just seemed to be a good<br>
&gt;     choice<br>
&gt;     &gt;     &gt;     regarding<br>
&gt;     &gt;     &gt;     &gt; to versioning limitations in jax-rs and our use of jax-rs<br>
&gt;     &gt;     &gt;     subresources.<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     The final picture isn&#39;t completely defined yet.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     Regards,<br>
&gt;     &gt;     &gt;     &gt;     &gt;     Juan Hernandez<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; On Mon, Oct 26, 2015 at 4:03 PM, Juan<br>
&gt;     Hernández<br>
&gt;     &gt;     &gt;     &lt;<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a><br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt; &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a><br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a><br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a><br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt; &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a><br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a> &lt;mailto:<a href="mailto:jhernand@redhat.com">jhernand@redhat.com</a>&gt;&gt;&gt;&gt;&gt;&gt;&gt; wrote:<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     Hello,<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     I will soon merge the following<br>
&gt;     patches that<br>
&gt;     &gt;     &gt;     introduce a new<br>
&gt;     &gt;     &gt;     &gt;     &gt;     way to<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     specify the contracts of the RESTAPI:<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;       restapi: Introduce metamodel<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;       <a href="https://gerrit.ovirt.org/45852" rel="noreferrer" target="_blank">https://gerrit.ovirt.org/45852</a><br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;       restapi: Use metamodel<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;       <a href="https://gerrit.ovirt.org/46478" rel="noreferrer" target="_blank">https://gerrit.ovirt.org/46478</a><br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;       restapi: Generate JAX-RS interfaces<br>
&gt;     from model<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;       <a href="https://gerrit.ovirt.org/47337" rel="noreferrer" target="_blank">https://gerrit.ovirt.org/47337</a><br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; Looks pretty much like we are replacing<br>
&gt;     one way of<br>
&gt;     &gt;     &gt;     &gt;     annotating things<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; with another way of specifying things.<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; Could you elaborate what the benefit of<br>
&gt;     that way of<br>
&gt;     &gt;     &gt;     &gt;     description is?<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; How would I customize endpoints with e.g.<br>
&gt;     @Gzip<br>
&gt;     &gt;     &gt;     annotations?<br>
&gt;     &gt;     &gt;     &gt;     Would<br>
&gt;     &gt;     &gt;     &gt;     &gt;     I at<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; the end still have my JAX-RS annotates<br>
&gt;     resource<br>
&gt;     &gt;     classes?<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     These patches introduce a new &quot;metamodel&quot;<br>
&gt;     &gt;     concept,<br>
&gt;     &gt;     &gt;     and move<br>
&gt;     &gt;     &gt;     &gt;     &gt;     the current<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     specification of the RESTAPI based on<br>
&gt;     XML schema<br>
&gt;     &gt;     &gt;     and JAX-RS<br>
&gt;     &gt;     &gt;     &gt;     &gt;     interfaces<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     to a new &quot;model&quot; built on the new<br>
&gt;     metamodel.<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     What does this mean for you in<br>
&gt;     practical terms?<br>
&gt;     &gt;     &gt;     &gt;     Currently when<br>
&gt;     &gt;     &gt;     &gt;     &gt;     you want<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     to introduce or modify one of the data<br>
&gt;     types<br>
&gt;     &gt;     used<br>
&gt;     &gt;     &gt;     by the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     RESTAPI you<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     start by modifying the XML schema.<br>
&gt;     Once the<br>
&gt;     &gt;     &gt;     patches are<br>
&gt;     &gt;     &gt;     &gt;     merged<br>
&gt;     &gt;     &gt;     &gt;     &gt;     the XML<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     schema will never be touched, as it<br>
&gt;     will be<br>
&gt;     &gt;     &gt;     automatically<br>
&gt;     &gt;     &gt;     &gt;     &gt;     generated from<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     the &quot;model&quot;. For example, imagine that you<br>
&gt;     &gt;     need to<br>
&gt;     &gt;     &gt;     add a new<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &quot;color&quot;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     attribute to the &quot;VM&quot; entity. To do so<br>
&gt;     with<br>
&gt;     &gt;     the new<br>
&gt;     &gt;     &gt;     &gt;     model you<br>
&gt;     &gt;     &gt;     &gt;     &gt;     will have<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     to modify the following file, which is the<br>
&gt;     &gt;     &gt;     specification of<br>
&gt;     &gt;     &gt;     &gt;     &gt;     the &quot;Vm&quot;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     entity, written as a Java interface:<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;<br>
&gt;      <a href="https://gerrit.ovirt.org/#/c/46478/16/backend/manager/modules/restapi/model/src/main/java/types/Vm.java" rel="noreferrer" target="_blank">https://gerrit.ovirt.org/#/c/46478/16/backend/manager/modules/restapi/model/src/main/java/types/Vm.java</a><br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     In that interface you will have to add a<br>
&gt;     &gt;     line like<br>
&gt;     &gt;     &gt;     this:<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;       String color();<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     Note that this Java interface is just the<br>
&gt;     &gt;     &gt;     specification<br>
&gt;     &gt;     &gt;     &gt;     of the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     entity,<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     it won&#39;t be used at all during runtime.<br>
&gt;     &gt;     Instead of<br>
&gt;     &gt;     &gt;     that the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     XML schema<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     will be generated from it, and then<br>
&gt;     Java will be<br>
&gt;     &gt;     &gt;     generated<br>
&gt;     &gt;     &gt;     &gt;     &gt;     from the XML<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     schema, as we do today (this will<br>
&gt;     change in the<br>
&gt;     &gt;     &gt;     future, but<br>
&gt;     &gt;     &gt;     &gt;     &gt;     not yet).<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     Same for the services. If you want to<br>
&gt;     add a new<br>
&gt;     &gt;     &gt;     &quot;paint&quot;<br>
&gt;     &gt;     &gt;     &gt;     action<br>
&gt;     &gt;     &gt;     &gt;     &gt;     to the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     &quot;Vm&quot; resource then you won&#39;t modify<br>
&gt;     the JAX-RS<br>
&gt;     &gt;     &gt;     interfaces,<br>
&gt;     &gt;     &gt;     &gt;     &gt;     instead of<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     that you will modify the following file,<br>
&gt;     &gt;     which is the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     specification of<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     the &quot;Vm&quot; service, written as a Java<br>
&gt;     interface:<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;<br>
&gt;      <a href="https://gerrit.ovirt.org/#/c/47337/6/backend/manager/modules/restapi/model/src/main/java/services/VmService.java" rel="noreferrer" target="_blank">https://gerrit.ovirt.org/#/c/47337/6/backend/manager/modules/restapi/model/src/main/java/services/VmService.java</a><br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     In that interface you will need to add a<br>
&gt;     &gt;     sub-interface<br>
&gt;     &gt;     &gt;     &gt;     &gt;     representing the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     action:<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;       interface Paint {<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;       }<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     The JAX-RS interface will be generated<br>
&gt;     from<br>
&gt;     &gt;     that.<br>
&gt;     &gt;     &gt;     &gt;     Currently these<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     sub-interfaces are empty. In the<br>
&gt;     future they<br>
&gt;     &gt;     will<br>
&gt;     &gt;     &gt;     &gt;     contain the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     specifications of the parameters<br>
&gt;     (currently<br>
&gt;     &gt;     in the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     rsdl_metadata.yml<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     file).<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     These changes will currently affect<br>
&gt;     only the<br>
&gt;     &gt;     &gt;     &gt;     specification of the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     RESTAPI, not the implementation, so in<br>
&gt;     in the<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &quot;Backend*Resource&quot; classes<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     things won&#39;t change yet.<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; Currently I do not really understand where we<br>
&gt;     &gt;     are going<br>
&gt;     &gt;     &gt;     &gt;     here. Are we<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; trying to get rid of rdsl?<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; So basically two questions:<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; 1) What is the final goal?<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; 2) What speaks agains using Hibernate<br>
&gt;     validator<br>
&gt;     &gt;     on Daos in<br>
&gt;     &gt;     &gt;     &gt;     combination<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; with JAX-RS annotated resources (and just<br>
&gt;     &gt;     removing all<br>
&gt;     &gt;     &gt;     &gt;     interfaces, as<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; far as I can see we only have one<br>
&gt;     implementation per<br>
&gt;     &gt;     &gt;     &gt;     endpoint) and<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; creating all schemas and clients through<br>
&gt;     SWAGGER<br>
&gt;     &gt;     tooling?<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     If you have doubts, please let me know.<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     Regards,<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     Juan Hernandez<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     --<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     Dirección Comercial: C/Jose Bardasano<br>
&gt;     Baos,<br>
&gt;     &gt;     9, Edif.<br>
&gt;     &gt;     &gt;     &gt;     Gorbea 3,<br>
&gt;     &gt;     &gt;     &gt;     &gt;     planta<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     3ºD, 28016 Madrid, Spain<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     Inscrita en el Reg. Mercantil de<br>
&gt;     Madrid – C.I.F.<br>
&gt;     &gt;     &gt;     B82657941 -<br>
&gt;     &gt;     &gt;     &gt;     &gt;     Red Hat<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     S.L.<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;      _______________________________________________<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     Devel mailing list<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;     <a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a><br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt; &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a><br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a><br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt; &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a><br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;<br>
&gt;     &gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;<br>
&gt;     &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a> &lt;mailto:<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a>&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;      <a href="http://lists.ovirt.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.ovirt.org/mailman/listinfo/devel</a><br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; Thanks,<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     &gt; Roman<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;     --<br>
&gt;     &gt;     &gt;     &gt;     &gt;     Dirección Comercial: C/Jose Bardasano Baos,<br>
&gt;     9, Edif.<br>
&gt;     &gt;     &gt;     Gorbea 3,<br>
&gt;     &gt;     &gt;     &gt;     planta<br>
&gt;     &gt;     &gt;     &gt;     &gt;     3ºD, 28016 Madrid, Spain<br>
&gt;     &gt;     &gt;     &gt;     &gt;     Inscrita en el Reg. Mercantil de Madrid – C.I.F.<br>
&gt;     &gt;     B82657941 -<br>
&gt;     &gt;     &gt;     &gt;     Red Hat<br>
&gt;     &gt;     &gt;     &gt;     &gt;     S.L.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; I don&#39;t know if it is the right thing to do to<br>
&gt;     invent<br>
&gt;     &gt;     &gt;     something new<br>
&gt;     &gt;     &gt;     &gt;     &gt; here. I personally would prefer to thread a path<br>
&gt;     which<br>
&gt;     &gt;     is very<br>
&gt;     &gt;     &gt;     &gt;     common on<br>
&gt;     &gt;     &gt;     &gt;     &gt; the java community.<br>
&gt;     &gt;     &gt;     &gt;     &gt; I would love follow the DRY principle regarding<br>
&gt;     to the<br>
&gt;     &gt;     stack<br>
&gt;     &gt;     &gt;     and the<br>
&gt;     &gt;     &gt;     &gt;     &gt; code and would just use the great community projects<br>
&gt;     &gt;     there.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; It would also completely eliminate any custom magic.<br>
&gt;     &gt;     The JAX-RS<br>
&gt;     &gt;     &gt;     &gt;     and CDI<br>
&gt;     &gt;     &gt;     &gt;     &gt; magic is pretty standard and easy to understand.<br>
&gt;     &gt;     &gt;     &gt;     &gt; From my perspective, real JAX-RS resoures have the<br>
&gt;     &gt;     advantage of<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;  * being very easy to understand (there is<br>
&gt;     magic, but the<br>
&gt;     &gt;     &gt;     &gt;     connection to<br>
&gt;     &gt;     &gt;     &gt;     &gt; the real endpoint is pretty clear)<br>
&gt;     &gt;     &gt;     &gt;     &gt;  * being easy to customize suff, like adding<br>
&gt;     @GZip to an<br>
&gt;     &gt;     &gt;     annotation<br>
&gt;     &gt;     &gt;     &gt;     &gt;  * describing pretty clearly the connection<br>
&gt;     between the<br>
&gt;     &gt;     &gt;     generated rest<br>
&gt;     &gt;     &gt;     &gt;     &gt; interface and the internal services<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; Finally writing hand crafted tests is also much<br>
&gt;     easier.<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; What are your thoughts about that?<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; Best Regards,<br>
&gt;     &gt;     &gt;     &gt;     &gt; Roman<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;     &gt; [1] <a href="https://github.com/rmohr/jetty-maven-cdi-demo" rel="noreferrer" target="_blank">https://github.com/rmohr/jetty-maven-cdi-demo</a><br>
&gt;     &gt;     &gt;     &gt;     &gt; [2]<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;<br>
&gt;      <a href="https://github.com/rmohr/jetty-maven-cdi-demo/blob/master/src/main/java/rmohr/examples/cdi/MyDto.java" rel="noreferrer" target="_blank">https://github.com/rmohr/jetty-maven-cdi-demo/blob/master/src/main/java/rmohr/examples/cdi/MyDto.java</a><br>
&gt;     &gt;     &gt;     &gt;     &gt; [3] <a href="http://swagger.io/" rel="noreferrer" target="_blank">http://swagger.io/</a><br>
&gt;     &gt;     &gt;     &gt;     &gt; [4] <a href="https://github.com/kongchen/swagger-maven-plugin" rel="noreferrer" target="_blank">https://github.com/kongchen/swagger-maven-plugin</a><br>
&gt;     &gt;     &gt;     &gt;     &gt; [5] <a href="https://github.com/swagger-api/swagger-codegen" rel="noreferrer" target="_blank">https://github.com/swagger-api/swagger-codegen</a><br>
&gt;     &gt;     &gt;     &gt;     &gt; [6]<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;<br>
&gt;      <a href="https://github.com/rmohr/jetty-maven-cdi-demo/blob/master/src/main/java/rmohr/examples/cdi/RestSubResource.java" rel="noreferrer" target="_blank">https://github.com/rmohr/jetty-maven-cdi-demo/blob/master/src/main/java/rmohr/examples/cdi/RestSubResource.java</a><br>
&gt;     &gt;     &gt;     &gt;     &gt; [7]<br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;<br>
&gt;      <a href="http://maxenglander.com/2013/04/23/basic-restful-api-versioning-in-jersey.html" rel="noreferrer" target="_blank">http://maxenglander.com/2013/04/23/basic-restful-api-versioning-in-jersey.html</a><br>
&gt;     &gt;     &gt;     &gt;     &gt; [8] <a href="https://github.com/swagger-api/swagger-ui" rel="noreferrer" target="_blank">https://github.com/swagger-api/swagger-ui</a><br>
&gt;     &gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;     &gt; [9]<br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     <a href="https://github.com/swagger-api/swagger-core/blob/master/modules/swagger-jaxrs/src/main/java/io/swagger/jaxrs/Reader.java" rel="noreferrer" target="_blank">https://github.com/swagger-api/swagger-core/blob/master/modules/swagger-jaxrs/src/main/java/io/swagger/jaxrs/Reader.java</a><br>
&gt;     &gt;     &gt;     &gt;<br>
&gt;     &gt;     &gt;<br>
&gt;     &gt;<br>
&gt;<br>
<br>
--<br>
Dirección Comercial: C/Jose Bardasano Baos, 9, Edif. Gorbea 3, planta<br>
3ºD, 28016 Madrid, Spain<br>
Inscrita en el Reg. Mercantil de Madrid – C.I.F. B82657941 - Red Hat S.L.<br>
</div></div></blockquote></div><br></div></div>