
5 Nov
2014
5 Nov
'14
5:06 p.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--