[ 
https://issues.apache.org/activemq/browse/CAMEL-588?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Claus Ibsen resolved CAMEL-588.
-------------------------------

    Resolution: Fixed

> Remove cycle between camel, spi and model
> -----------------------------------------
>
>                 Key: CAMEL-588
>                 URL: https://issues.apache.org/activemq/browse/CAMEL-588
>             Project: Apache Camel
>          Issue Type: Improvement
>    Affects Versions: 1.4.0
>            Reporter: Christian Schneider
>            Assignee: Claus Ibsen
>             Fix For: 2.0.0
>
>         Attachments: camel_model.patch, post_camel_model_patch.png, 
> pre_camel_model_patch.png
>
>
> Currently there is a bad dependency cycle between camel, spi and model. 
> camel.CamelContext references model.RouteType. spi.RouteContext references 
> model.RouteType and model.FromType.  Additionally spi.RouteContext and 
> spi.InterceptStrategy reference model.ProcessorType. These references are 
> especially bad ones as camel and spi are the most low level packages and 
> these references close the loop that makes camel one big tangle. I managed to 
> remove this tangle and so lower the excess(xs) measurement in structure 101 
> from 4300 to 2400. I added the dependency views to the issue. I hided the 
> deprecated CamelTemplate in the views to show that the cycle will be broken 
> once we can delete this.
> The first thing I found out is that model is in my opinion not especially 
> well named. The model package is not the inner domain model of camel as the 
> name suggests but more the java dsl. So I think it could make sense to rename 
> it at some point into javadsl or dsl. This change would be too destructive so 
> I did not change this. But I think it is reasonable to define that camel and 
> spi should not be dependent on the dsl as the dsl is only needed while 
> creating the routes. So my goal was to cut these dependencies.
> I first moved spi.RouteContext and spi.InterceptStrategy to model. With 
> RouteContext I am quite sure that this is a good thing as it is only needed 
> in the Java DSL and the builders. InterceptStrategy is of course part of an 
> spi but as it references model it can“t life in spi.  As LifecycleStrategy 
> references RouteContext I split this interface in the part that does not 
> references RouteContext which I just left in spi and a new interface 
> ModelLifecycleStrategy which lives in model. This interface has the 
> onRouteContextCreate.
> Then I reworked the communication between DefaultCamelContext and 
> RouteBuilder. I removed the routedefinitions from DefaultCamelContext and 
> mode sure they are not needed anywhere. So only the RouteBuilder knows about 
> the definitions and keeps them encapsulated. In the current code the 
> intialization of the RouteBuilder and the transfer of Routes and 
> RouteDefinitions between Routebuilder and DefaultCamelContext is very 
> complicated and intransparent. The getRouteList does the initialization as a 
> side effect and additionally feeds the route definitions into the 
> CamelContext. This is extremly intransparent. I replaced this with a simple 
> and speaking method in Routes. btw I would vote to rename Routes to 
> RouteProvider. This would make the responsbility clearer.
> List<Route> configureAndRetrieveRoutes(CamelContext context) throws Exception;
> This method intializes the RouteBuilder, creates the definitions and routes 
> and simply returns the List of Routes. This is all communication between 
> DefaultCamelContext and RouteBuilder. The only little difference in behaviour 
> compared to before is that the Endpoint resolution happens already in this 
> step and not when the CamelContext is started.
> All unit tests except one worked out of the box with this change. The one 
> that failed was RouteWithMistypeComponentNameTest. I this test the expected 
> exception happened now while adding the RouteBuilder to the context not when 
> starting the context. This was easily solved by extending the try to include 
> the addRoutes call. This is of course a minor change in contract but I 
> believe the architectural benefits are worth this little change.
> I also had to do some little tweaks to make the GraphGeneratorSupport work 
> again. As CamelContext now does not know the route definitions this 
> information has to be taken from BuilderSupport. So made the CamelContext 
> know all its RouteBuilders as a list of Routes. In the Graph generation I 
> then cast them to BuilderSupport and extract the route defintions. So I was 
> able to keep the balance between encapsulation and enough knowledge to draw 
> the graphs. 
> The last thing I did was to remove the createProcessor method from 
> RouteContext. I think this method was quite redundant. I was able to replace 
> all occurances of this with the much simpler call. 
> RouteType.createOutputProcessor. This removes another part of a cycle.
> I set the version for this issue to 1.4.0 so it does not get lost but feel 
> free to move it to the version of camel where you want it solved. As this is 
> a big patch I would of course prefer it to be commited as soon as possible. 
> If we wait too long I probably have to redo the patch as there will be too 
> many changes in camel in the mean time.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to