[ https://issues.apache.org/jira/browse/IGNITE-14496?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Ivan Bessonov updated IGNITE-14496: ----------------------------------- Labels: iep-55 ignite-3 (was: ignite-3) > Move configuration annotations to configuration-api > --------------------------------------------------- > > Key: IGNITE-14496 > URL: https://issues.apache.org/jira/browse/IGNITE-14496 > Project: Ignite > Issue Type: Sub-task > Affects Versions: 3.0.0-alpha2 > Reporter: Semyon Danilov > Assignee: Ivan Bessonov > Priority: Major > Labels: iep-55, ignite-3 > Fix For: 3.0.0-alpha3 > > Time Spent: 0.5h > Remaining Estimate: 0h > > h3. Problem > In this issue we need to move all API from *ignite-configuration* module into > *ignite-api*. This comes with a price, we can't just move our classes. The > problem is that code generator generates (in principal) two thing: > * schema-based general interfaces: > ** {{*View}} > ** {{*Change}} > ** {{*Configuration}} > * schema-based implementations: > ** {{*Node}} > ** {{*ConfigurationImpl}} > First set of interfaces depends on +other interfaces only+. This is good and > pretty much all we need in resulting *ignite-api* sources. > Second set of classes requires us to have classes like {{InnerNode}} or > {{ConfigurationChanger}} in compile-time dependencies, which is clearly wrong > for API. These 2 classes must be in another Java module and that's a problem. > There are two approaches to solve the problem, I'll try my best to describe > both. > h3. Common problem for both solutions > *ignite-configuration-annotation-processor* clearly depends on *ignite-api* > in our case AND at the same time *ignite-api* should use annotation > processing. We have cycling dependency. Right way of resolving it is to > create module *ignite-configuration-api*. This shows us that having +all+ API > in one module is probably not the best idea. > h3. Solution 1 - split annotation processor into 2 > There's no doubt that we need processor that will generate first set of > interfaces. We already have it. We could create a second annotation processor > that will generate implementations into other modules, let's call it > *impl-processor*. But Java annotation processing API can't do that directly. > If we compile module *B* that depends on module *A*, only classes from *B* > will be passed into environment of *impl-processor*. We have to options of > how to resolve it: > * use libraries like [classgraph|https://github.com/classgraph/classgraph], > having *ignite-api* as hardcoded compiler dependency in annotation processor. > Works in theory BUT there are issues: > ** there's no clear way of distinguishing schemas that you should process in > current module from those that you shouldn't; > ** *ignite-api* dependency is hardcoded as an optional source of schemas, > which is a questionable thing. > * include package with desired schemas using maven helper plugin. This > approach also has issues: > ** now we understand how to configure it, but such configuration will > require more manual steps and either separate package for modules schemas or > include/exclude list in helper plugin configuration; > ** we will have several identical **.class* files in target directories of > different modules. > h3. Solution 2 - leave only one annotation processor and generate everything > else at runtime > This approach requires 0 additional configuration. {{Node}} and > {{ConfigurationImpl}} can be generated from schemas when you register new > root key. We already have *ignite-bytecode* module so there's no need for > additional libraries in dependencies. Usages of the module can be seen in > module *ignite-schema*. I assume that writing tests will be much easier with > runtime code generation. Also classes like {{InnerNode}} will probably become > package-private. The problems are: > * potential problems during debugging. I don't see it as a problem. Given > that we'll cover everything with tests, generator code will be pretty stable; > * generating code requires time. Doesn't look like it really needs a > significant amount of time though; > * we can start several nodes in a single JVM so there might be collisions of > other issues. The problem is purely technical; > * choice of {{ClassLoader}} for generated classes has to be very careful. > Situation when generated configuration class cannot be loaded for some reason > is unacceptable. > h3. Solution 3 - just generate implementation classes into api module > > IMHO, second solution is better. The fact that API usage becomes better > overweights the fact that we would need to generate different parts of > configuration code using different tools. -- This message was sent by Atlassian Jira (v8.3.4#803005)