--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(a)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(a)redhat.com> wrote:
>=20
>=20
>=20
> ----- Original Message -----
>> From: "Vojtech Szocs" <vszocs(a)redhat.com
>> To: "Alon Bar-Lev" <alonbl(a)redhat.com
>> Cc: devel(a)ovirt.org, "Mark Proctor"
<mdproctor(a)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(a)redhat.com
>>> To: "Vojtech Szocs"
<vszocs(a)redhat.com
>>> Cc: devel(a)ovirt.org,
"Mark Proctor" <mdproctor(a)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(a)redhat.com
>>>> To: devel(a)ovirt.org
>>>> Cc: "Mark Proctor" <mdproctor(a)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(a)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-CksU...
Jv4uB-dKQSgHPX6rU/edit#slide=3Did.p14" =
class=3D"">https://docs.google.com/presentation/d/1KImrCvvqa...
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-w...
ch.html" =
class=3D"">http://blog.athico.com/2014/11/red-hat-jboss-brms...
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(a)redhat.com</a>&gt; =
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(a)redhat.com</a>&gt;<br
class=3D"">To: "Alon Bar-Lev" =
<<a href=3D"mailto:alonbl@redhat.com" =
class=3D"">alonbl(a)redhat.com</a>&gt;<br
class=3D"">Cc: <a =
href=3D"mailto:devel@ovirt.org"
class=3D"">devel(a)ovirt.org</a>, "Mark =
Proctor" <<a href=3D"mailto:mdproctor@gmail.com" =
class=3D"">mdproctor(a)gmail.com</a>&gt;<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(a)redhat.com</a>&gt;<br =
class=3D"">To: "Vojtech Szocs" <<a
href=3D"mailto:vszocs@redhat.com" =
class=3D"">vszocs(a)redhat.com</a>&gt;<br
class=3D"">Cc: <a =
href=3D"mailto:devel@ovirt.org"
class=3D"">devel(a)ovirt.org</a>, "Mark =
Proctor" <<a href=3D"mailto:mdproctor@gmail.com" =
class=3D"">mdproctor(a)gmail.com</a>&gt;<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(a)redhat.com</a>&gt;<br =
class=3D"">To: <a href=3D"mailto:devel@ovirt.org" =
class=3D"">devel(a)ovirt.org</a><br class=3D"">Cc:
"Mark Proctor" <<a =
href=3D"mailto:mdproctor@gmail.com" =
class=3D"">mdproctor(a)gmail.com</a>&gt;<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<... =
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--