5 Nov
2014
5 Nov
'14
11:06 a.m.
--Apple-Mail=_EFCB2602-4A51-4D64-9D5F-1F81EDF760BA
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset=utf-8
Not sure if my previous email made it to the wider level@ovirt.org list. =
I just subscribed :) So I=E2=80=99ll repeat the info.
Here is a migration path, with detailed explanation on GWTP mappings:
=
https://docs.google.com/presentation/d/1KImrCvvqaUTgULP-CksUfGwLchJv4uB-dK=
QSgHPX6rU/edit#slide=3Did.p14 =
<https://docs.google.com/presentation/d/1KImrCvvqaUTgULP-CksUfGwLchJv4uB-d=
KQSgHPX6rU/edit#slide=3Did.p14>
Here presentation I gave yesterday, showing all the work we=E2=80=99ve =
done in BRMS and BPMS and doing.
=
http://blog.athico.com/2014/11/red-hat-jboss-brms-and-bpms-workbench.html =
<http://blog.athico.com/2014/11/red-hat-jboss-brms-and-bpms-workbench.html=
>
It also shows a little around our Screens and Perspective plugins, or =
two units of extensions. Both of which have polyglot bindings =
(GWTExported, will migrate to @JsType later). Implicitly Maven is our =
unit of modularity, with maven dependency tree to declare this - however =
this is not recognised in any internal registry. CDI just scans and =
picks up any @Screen, @Perspective etc. But could be added, to give =
physical representation of that unit of modality, with life cycle =
callbacks - we just haven=E2=80=99t had a need for this yet.
Our plan over 2015 is to use JsType to create a contract for all the =
things a module needs. We will then compile modules separately against =
this, with iframe separation, so each Module is loaded as a separate GWT =
app. This does mean GWT core repetition, a pita, but that atleast gets =
us started and may be solvable by a custom GWT linker.
Longer term we=E2=80=99d like to work with GWT team. They now use the =
Closure compiler, this support symbol tables, and I expect how their =
incremental compiler works for their super dev mode. We want to achieve =
two things 1) stop recompilation of maven modules, when aggregated into =
sub projects. 2) declare apis that cannot be pruned 3) export a symbol =
table to allow later compilation of runtime extensions against those, =
without requiring a repetition of the GWT core (i.e. problem with our =
first attempt).
We will still continue with our polyglot bindings approach, such as with =
the AngularJS stuff we have done. But I do not see this as the ideal =
programming model - it hides much of what Errai brings, around event =
bus, and general java refactoring capabilities. However it is still =
useful for our customers, who want to write extensions, but do not want =
to touch or learn GWT.
Mark
=20
> On 5 Nov 2014, at 15:32, Alon Bar-Lev <alonbl@redhat.com> wrote:
>=20
>=20
>=20
> ----- Original Message -----
>> From: "Vojtech Szocs" <vszocs@redhat.com>
>> To: "Alon Bar-Lev" <alonbl@redhat.com>
>> Cc: devel@ovirt.org, "Mark Proctor" <mdproctor@gmail.com>
>> Sent: Wednesday, November 5, 2014 5:24:14 PM
>> Subject: Re: [ovirt-devel] Thoughts on modularization
>>=20
>>=20
>>=20
>> ----- Original Message -----
>>> From: "Alon Bar-Lev" <alonbl@redhat.com>
>>> To: "Vojtech Szocs" <vszocs@redhat.com>
>>> Cc: devel@ovirt.org, "Mark Proctor" <mdproctor@gmail.com>
>>> Sent: Wednesday, November 5, 2014 4:12:06 PM
>>> Subject: Re: [ovirt-devel] Thoughts on modularization
>>>=20
>>>=20
>>>=20
>>> ----- Original Message -----
>>>> From: "Vojtech Szocs" <vszocs@redhat.com>
>>>> To: devel@ovirt.org
>>>> Cc: "Mark Proctor" <mdproctor@gmail.com>
>>>> Sent: Wednesday, November 5, 2014 5:04:24 PM
>>>> Subject: [ovirt-devel] Thoughts on modularization
>>>>=20
>>>> Hi guys,
>>>>=20
>>>> I've discussed this recently with Yair and Mark, I just wanted to =
share
>>>> some more thoughts on this topic -- in particular, how =
modularization
>>>> problem can be approached (regardless of implementation details).
>>>>=20
>>>> I see two approaches here. The typical one is to define APIs for =
modules
>>>> to consume. For example, oVirt Engine extension API has API for =
auth
>>>> stuff; oVirt UI plugin API has API for showing tabs and dialogs, =
etc.
>>>> The advantage is strict consistency, disadvantage is burden of =
having
>>>> to maintain the whole API. With this approach, you tell modules: =
"This
>>>> is the API to work with system, defining how you can plug into it."
>>>>=20
>>>> Now turn 180 degrees. The other approach, which is really =
interesting,
>>>> is to let modules themselves export API. This naturally leads to =
module
>>>> hierarchies. Ultimately, this leads to micro-kernel-style =
development,
>>>> where all logic resides in modules. Now you might ask: "What if we =
want
>>>> to employ some consistent work flow across multiple modules? For =
example,
>>>> have some pluggable *auth* infra?" -- this can be done via some =
"higher"
>>>> level module, that exports API and "lower" level modules consume =
that
>>>> API.
>>>>=20
>>>> If you have any ideas, please share!
>>>=20
>>> Both solutions can be applied using existing extension api, an =
extension
>>> can
>>> locate other extension and interact with it the same way the core =
interacts
>>> with extensions.
>>=20
>> But how does core interact with extensions? I assume via well-defined
>> API, i.e. in accordance with first approach mentioned above.
>=20
> presentation:
> http://www.ovirt.org/File:Ovirt_3.5_-_aaa.pdf =
<http://www.ovirt.org/File:Ovirt_3.5_-_aaa.pdf>
>=20
> package org.ovirt.engine.api.extensions;
>=20
> /**
> * Interface of an extension.
> */
> public interface Extension {
>=20
> /**
> * Invoke operation.
> * @param input input parameters.
> * @param output output parameters.
> *
> * <p>
> * Interaction is done via the parameters.
> * Exceptions are not allowed.
> * </p>
> * <p>
> * Basic mappings available at {@link Base}.
> * </p>
> *
> * @see Base
> */
> void invoke(ExtMap input, ExtMap output);
>=20
> }
>=20
>> With second approach mentioned above, core would not interact with
>> extensions at all (or in a very limited way), instead - extensions
>> would interact with each other. In other words, extension would not
>> need to implement core-specific API (there would be none), instead
>> it would inject its dependencies (other modules/extensions) and
>> consume their APIs. This is the difference I wanted to point out :)
>=20
> The extension interface is primitive to enable exactly that, provided =
java people will open their minds :)
>=20
> Regards,
> Alon
--Apple-Mail=_EFCB2602-4A51-4D64-9D5F-1F81EDF760BA
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
charset=utf-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Dutf-8"></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" =
class=3D"">Not sure if my previous email made it to the wider <a =
href=3D"mailto:level@ovirt.org" class=3D"">level@ovirt.org</a> list. I =
just subscribed :) So I=E2=80=99ll repeat the info.<div class=3D""><br =
class=3D""></div><div class=3D"">Here is a migration path, with detailed =
explanation on GWTP mappings:</div><div class=3D""><a =
href=3D"https://docs.google.com/presentation/d/1KImrCvvqaUTgULP-CksUfGwLch=
Jv4uB-dKQSgHPX6rU/edit#slide=3Did.p14" =
class=3D"">https://docs.google.com/presentation/d/1KImrCvvqaUTgULP-CksUfGw=
LchJv4uB-dKQSgHPX6rU/edit#slide=3Did.p14</a></div><div class=3D""><br =
class=3D""></div><div class=3D"">Here presentation I gave yesterday, =
showing all the work we=E2=80=99ve done in BRMS and BPMS and =
doing.</div><div class=3D""><a =
href=3D"http://blog.athico.com/2014/11/red-hat-jboss-brms-and-bpms-workben=
ch.html" =
class=3D"">http://blog.athico.com/2014/11/red-hat-jboss-brms-and-bpms-work=
bench.html</a></div><div class=3D""><br class=3D""></div><div =
class=3D"">It also shows a little around our Screens and Perspective =
plugins, or two units of extensions. Both of which have polyglot =
bindings (GWTExported, will migrate to @JsType later). Implicitly Maven =
is our unit of modularity, with maven dependency tree to declare this - =
however this is not recognised in any internal registry. CDI just scans =
and picks up any @Screen, @Perspective etc. But could be added, to give =
physical representation of that unit of modality, with life cycle =
callbacks - we just haven=E2=80=99t had a need for this yet.</div><div =
class=3D""><br class=3D""></div><div class=3D"">Our plan over 2015 is to =
use JsType to create a contract for all the things a module needs. We =
will then compile modules separately against this, with iframe =
separation, so each Module is loaded as a separate GWT app. This does =
mean GWT core repetition, a pita, but that atleast gets us started and =
may be solvable by a custom GWT linker.</div><div class=3D""><br =
class=3D""></div><div class=3D"">Longer term we=E2=80=99d like to work =
with GWT team. They now use the Closure compiler, this support symbol =
tables, and I expect how their incremental compiler works for their =
super dev mode. We want to achieve two things 1) stop recompilation of =
maven modules, when aggregated into sub projects. 2) declare apis that =
cannot be pruned 3) export a symbol table to allow later compilation of =
runtime extensions against those, without requiring a repetition of the =
GWT core (i.e. problem with our first attempt).</div><div class=3D""><br =
class=3D""></div><div class=3D"">We will still continue with our =
polyglot bindings approach, such as with the AngularJS stuff we have =
done. But I do not see this as the ideal programming model - it hides =
much of what Errai brings, around event bus, and general java =
refactoring capabilities. However it is still useful for our customers, =
who want to write extensions, but do not want to touch or learn =
GWT.</div><div class=3D""><br class=3D""></div><div =
class=3D"">Mark</div><div class=3D""><br class=3D""></div><div =
class=3D""> <br class=3D""><div><blockquote type=3D"cite" =
class=3D""><div class=3D"">On 5 Nov 2014, at 15:32, Alon Bar-Lev <<a =
href=3D"mailto:alonbl@redhat.com" class=3D"">alonbl@redhat.com</a>> =
wrote:</div><br class=3D"Apple-interchange-newline"><div class=3D""><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><br style=3D"font-family:=
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D""><span style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D"">----- Original Message -----</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><blockquote type=3D"cite"=
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D"">From: "Vojtech Szocs" =
<<a href=3D"mailto:vszocs@redhat.com" =
class=3D"">vszocs@redhat.com</a>><br class=3D"">To: "Alon Bar-Lev" =
<<a href=3D"mailto:alonbl@redhat.com" =
class=3D"">alonbl@redhat.com</a>><br class=3D"">Cc: <a =
href=3D"mailto:devel@ovirt.org" class=3D"">devel@ovirt.org</a>, "Mark =
Proctor" <<a href=3D"mailto:mdproctor@gmail.com" =
class=3D"">mdproctor@gmail.com</a>><br class=3D"">Sent: Wednesday, =
November 5, 2014 5:24:14 PM<br class=3D"">Subject: Re: [ovirt-devel] =
Thoughts on modularization<br class=3D""><br class=3D""><br class=3D""><br=
class=3D"">----- Original Message -----<br class=3D""><blockquote =
type=3D"cite" class=3D"">From: "Alon Bar-Lev" <<a =
href=3D"mailto:alonbl@redhat.com" class=3D"">alonbl@redhat.com</a>><br =
class=3D"">To: "Vojtech Szocs" <<a href=3D"mailto:vszocs@redhat.com" =
class=3D"">vszocs@redhat.com</a>><br class=3D"">Cc: <a =
href=3D"mailto:devel@ovirt.org" class=3D"">devel@ovirt.org</a>, "Mark =
Proctor" <<a href=3D"mailto:mdproctor@gmail.com" =
class=3D"">mdproctor@gmail.com</a>><br class=3D"">Sent: Wednesday, =
November 5, 2014 4:12:06 PM<br class=3D"">Subject: Re: [ovirt-devel] =
Thoughts on modularization<br class=3D""><br class=3D""><br class=3D""><br=
class=3D"">----- Original Message -----<br class=3D""><blockquote =
type=3D"cite" class=3D"">From: "Vojtech Szocs" <<a =
href=3D"mailto:vszocs@redhat.com" class=3D"">vszocs@redhat.com</a>><br =
class=3D"">To: <a href=3D"mailto:devel@ovirt.org" =
class=3D"">devel@ovirt.org</a><br class=3D"">Cc: "Mark Proctor" <<a =
href=3D"mailto:mdproctor@gmail.com" =
class=3D"">mdproctor@gmail.com</a>><br class=3D"">Sent: Wednesday, =
November 5, 2014 5:04:24 PM<br class=3D"">Subject: [ovirt-devel] =
Thoughts on modularization<br class=3D""><br class=3D"">Hi guys,<br =
class=3D""><br class=3D"">I've discussed this recently with Yair and =
Mark, I just wanted to share<br class=3D"">some more thoughts on this =
topic -- in particular, how modularization<br class=3D"">problem can be =
approached (regardless of implementation details).<br class=3D""><br =
class=3D"">I see two approaches here. The typical one is to define APIs =
for modules<br class=3D"">to consume. For example, oVirt Engine =
extension API has API for auth<br class=3D"">stuff; oVirt UI plugin API =
has API for showing tabs and dialogs, etc.<br class=3D"">The advantage =
is strict consistency, disadvantage is burden of having<br class=3D"">to =
maintain the whole API. With this approach, you tell modules: "This<br =
class=3D"">is the API to work with system, defining how you can plug =
into it."<br class=3D""><br class=3D"">Now turn 180 degrees. The other =
approach, which is really interesting,<br class=3D"">is to let modules =
themselves export API. This naturally leads to module<br =
class=3D"">hierarchies. Ultimately, this leads to micro-kernel-style =
development,<br class=3D"">where all logic resides in modules. Now you =
might ask: "What if we want<br class=3D"">to employ some consistent work =
flow across multiple modules? For example,<br class=3D"">have some =
pluggable *auth* infra?" -- this can be done via some "higher"<br =
class=3D"">level module, that exports API and "lower" level modules =
consume that<br class=3D"">API.<br class=3D""><br class=3D"">If you have =
any ideas, please share!<br class=3D""></blockquote><br class=3D"">Both =
solutions can be applied using existing extension api, an extension<br =
class=3D"">can<br class=3D"">locate other extension and interact with it =
the same way the core interacts<br class=3D"">with extensions.<br =
class=3D""></blockquote><br class=3D"">But how does core interact with =
extensions? I assume via well-defined<br class=3D"">API, i.e. in =
accordance with first approach mentioned above.<br =
class=3D""></blockquote><br style=3D"font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" =
class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D"">presentation:</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><a =
href=3D"http://www.ovirt.org/File:Ovirt_3.5_-_aaa.pdf" =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" =
class=3D"">http://www.ovirt.org/File:Ovirt_3.5_-_aaa.pdf</a><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><br style=3D"font-family:=
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D""><span style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D"">package =
org.ovirt.engine.api.extensions;</span><br style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D""><br style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D""><span style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D"">/**</span><br style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant: normal; font-weight: =
normal; letter-spacing: normal; line-height: normal; orphans: auto; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: =
0px;" class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D"">* Interface of an =
extension.</span><br style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" =
class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D"">*/</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><span =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D"">public interface Extension {</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><br style=3D"font-family:=
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D""><span style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D""> /**</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><span =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D""> * Invoke =
operation.</span><br style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" =
class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D""> * =
@param input input parameters.</span><br style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D""><span style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D""> * @param output output =
parameters.</span><br style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" =
class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" =
class=3D""> *</span><br style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D""><span style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D""> * <p></span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><span =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D""> * Interaction is done =
via the parameters.</span><br style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant: normal; font-weight: =
normal; letter-spacing: normal; line-height: normal; orphans: auto; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: =
0px;" class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D""> * =
Exceptions are not allowed.</span><br style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant: normal; font-weight: =
normal; letter-spacing: normal; line-height: normal; orphans: auto; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: =
0px;" class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D""> * =
</p></span><br style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" =
class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D""> * =
<p></span><br style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" =
class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D""> * =
Basic mappings available at {@link Base}.</span><br style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D""><span style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D""> * </p></span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><span =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D""> *</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><span =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D""> * @see Base</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><span =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D""> */</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><span =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D""> void invoke(ExtMap input, =
ExtMap output);</span><br style=3D"font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" =
class=3D""><br style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" =
class=3D""><span style=3D"font-family: Helvetica; font-size: 12px; =
font-style: normal; font-variant: normal; font-weight: normal; =
letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: =
none; display: inline !important;" class=3D"">}</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><br style=3D"font-family:=
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D""><blockquote type=3D"cite" =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D"">With second approach =
mentioned above, core would not interact with<br class=3D"">extensions =
at all (or in a very limited way), instead - extensions<br =
class=3D"">would interact with each other. In other words, extension =
would not<br class=3D"">need to implement core-specific API (there would =
be none), instead<br class=3D"">it would inject its dependencies (other =
modules/extensions) and<br class=3D"">consume their APIs. This is the =
difference I wanted to point out :)<br class=3D""></blockquote><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><span =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D"">The extension interface is primitive to enable =
exactly that, provided java people will open their minds :)</span><br =
style=3D"font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; =
line-height: normal; orphans: auto; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: auto; word-spacing: =
0px; -webkit-text-stroke-width: 0px;" class=3D""><br style=3D"font-family:=
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D""><span style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D"">Regards,</span><br style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px;" class=3D""><span style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant: normal; =
font-weight: normal; letter-spacing: normal; line-height: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; float: none; display: inline =
!important;" class=3D"">Alon</span></div></blockquote></div><br =
class=3D""></div></body></html>=
--Apple-Mail=_EFCB2602-4A51-4D64-9D5F-1F81EDF760BA--