Some dynamic reconfiguration samples

In this section, we will show you some of the reconfiguration actions available with FraSCAti. We will show how to perform these reconfigurations both programmaticaly (FraSCAti FScript) and graphically (FraSCAti Explorer). This section relies on the reconfig example but you can reproduce actions on whatever you want.

Starting / Stopping an SCA component

FraSCAti introduces a life cycle to SCA components. It means that you are able to start and stop any SCA composite / components in the architecture. By stopping a component, all incoming calls are queued and you can perform reconfiguration on it. Stopinng a composite implies stoppin all its descendants. For more details on the Lifecycle, take a look at http://fractal.ow2.org/specification/index.html#tth_sEc4.5.

FraSCAti FScript

Nothing difficult here, you just need to call the start/stop action with the targeted component as parameter.

FraSCAtiFScript> $root
#<scacomponent: reconfig>

FraSCAtiFScript> stop($root)
FraSCAtiFScript> state($root)
STOPPED

FraSCAtiFScript> start($root)
FraSCAtiFScript> state($root)
STARTED

FraSCAti Explorer

FraSCAti Explorer offers actions on objects in the tree with a right-click. It opens a menu with all available actions. On a component, you can find the Stop menu item (if the component status is STARTED). Just click on the menu item and the component is stopped. The component is now displayed in grey-scaled color.

The component is now stopped. The menu now display the start action. Note that there is also an icon available on the menu bar to stop/start components.

Update an SCA property

As described in the SCA specification, properties are used to configure components without hard-coded values in the implementation. FraSCAti goes a step forward by allowing to dynamically reconfigure properties on running components/composites.

FraSCAti FScript

You can get the value of any SCA property with the value() procedure. To set a value, you just have to call set-value with the property node as first parameter and the new value in second position.

FraSCAtiFScript> dollarRate = $root/scaproperty::dollarExchangeRate;
[#<scaproperty: currency-converter.dollarExchangeRate>]

FraSCAtiFScript> value($dollarRate)
0.75
FraSCAtiFScript> set-value($dollarRate, 0.81)
FraSCAtiFScript> value($dollarRate)
0.81

FraSCAti Explorer

With the FraSCAti Explorer, SCA properties are displayed in the right panel. you just need to modify the property value in the table as this field is editable. You have to press enter to validate your changes in the box.

Add / Remove an SCA intent

SCA Intents are used to add non-functionnal services to business components. SCA Intents are implemented as SCA components in OW2 FraSCAti. In this way, you don't need to use another technology to develop intents.

OW2 FraSCAti allows you to dynamically weaves intents (in a Aspect Oriented Programming way) on SCA services / references. Intents can be declared in a static way with the 'requires' keyword in the SCA composite file.

Fot this tutorial part, you need to load the frascati debug intent into the FraSCAti runtime.

FraSCAti FScript

First, we need to get a reference to the SCA intent to weave. Here we store a reference to the frascati debug intent into the debugIntent variable. Then we have to get a reference to the targetted SCA service or reference. We will store the run service of the reconfig component into the runService variable. Last, you just have to call the add-scaintent(<target>, <intent>) procedure to weave the intent on the targetted SCA service/reference. so, the last action weaves the debug intent on the run service.

FraSCAtiFScript> debugIntent = $domain/scachild::frascati-debug;
[#<scacomponent: frascati-debug>]

FraSCAtiFScript> runService = $domain/scachild::reconfig/scaservice::r;
[#<scaservice: reconfig.r>]

FraSCAtiFScript> add-scaintent($runService, $debugIntent)

Now, if you invoke the run method of the r service, you will see the trace of the debug intent on the console.

[INFO] [FRASCATI-DEBUG] Before calling:
[INFO] [FRASCATI-DEBUG]  component: reconfig
[INFO] [FRASCATI-DEBUG]  service: r         
[INFO] [FRASCATI-DEBUG]  method: public abstract void java.lang.Runnable.run()
[INFO] 100$ are worth about 75.0€.                                      
[INFO] Updating exchange rate to 0.823 ...Setting Dollar exchange rate to '0.823'.
[INFO]  Done!                                                                     
[INFO] 100$ are now worth about 82.3€.                                            
[INFO] Updating exchange rate to 0.698177756 ...                                  
[INFO] +-> Adding procedure 'reconfigure-converter' to FraSCAti FScript engine      
[INFO] Setting Dollar exchange rate to '0.698177756'.                             
[INFO] Done!                                                                      
[INFO] 100$ are now worth about 69.8177756€.                                      
[INFO] [FRASCATI-DEBUG] After calling:                                            
[INFO] [FRASCATI-DEBUG]  component: reconfig                                      
[INFO] [FRASCATI-DEBUG]  service: r                                               
[INFO] [FRASCATI-DEBUG]  method: public abstract void java.lang.Runnable.run()

Let's remoce the intent.

FraSCAtiFScript> remove-scaintent($runService, $debugIntent)

The output is now as following after a r/run() invocation:

[INFO] 100$ are worth about 69.8177756€.
[INFO] Updating exchange rate to 0.823 ...Setting Dollar exchange rate to '0.823'.
[INFO]  Done!
[INFO] 100$ are now worth about 82.3€.
[INFO] Updating exchange rate to 0.698177756 ...
[INFO] +-> Adding procedure 'reconfigure-converter' to FraSCAti FScript engine
[INFO] Setting Dollar exchange rate to '0.698177756'.
[INFO] Done!
[INFO] 100$ are now worth about 69.8177756€.

FraSCAti Explorer

Weave / unweave intents with FraSCAti Explorer is as easy as drag and drop an SCA intent (an SCA component with a service implementing the org.ow2.frascati.tinfi.control.intent.IntentHandler interface) on the target SCA service / reference. A new icon is now displayed as child of the service / reference item to show intents weaved on it. A right-click on an intent icon enables the 'Remove intent' menu item. By clicking on it, you remove the intent from the target service / reference.

Wire / Unwire SCA components

SCA wires are involved when no remote communications are required and when components are in the same runtime box.

FraSCAti FScript

We first need to get a reference to the SCA service and the SCA reference implied in the wire. We also need a reference to the component owning the SCA reference because we need to stop it before unwiring. The following commands remove the wire between the updater reference of the client component and the exchangeRateUpdater service of the converter composite.

FraSCAtiFScript> client = $domain/scadescendant::client;
[#<scacomponent: client>]
FraSCAtiFScript> client-updater = $client/scareference::updater;
[#<scareference: client.updater>]
FraSCAtiFScript> updater-service = $domain/scadescendant::converter/scaservice::exchangeRateUpdater;
[#<scaservice: converter.exchangeRateUpdater>]

FraSCAtiFScript> stop($client)
FraSCAtiFScript> remove-scawire($client-updater, $updater-service)
FraSCAtiFScript> start($client)

There is no need to stop the component owning the reference to wire an SCA reference.

FraSCAtiFScript> add-scawire($client-updater, $updater-service)

you can check wire/unwire actions by invoking services using the updater service (the r service for instance).

FraSCAti Explorer

Within the FraSCAti explorer framework, you need to stop the component owning the SCA reference to wire/unwire to enable the wire/unwire menu item on SCA references. Once the component stopped, a right-click on a SCA reference will propose you either the unwire menu item if the reference is bound or the wire menu item if the reference is not bound.

For instance, we can stop the client component. Its updater reference is bound, so we can unwire it with the menu item.

The updater reference is now unbound. We can wire it to an SCA service by clicking on the wire menu item on the updater reference. A new window appears, allowing you to select the SCA service to bind in a tree. Of course, the SCA service interface must match to the one of the SCA reference.

Add / Remove SCA binding

One would like to dynamically add a remote binding to an SCA service/reference or just add a new remote binding (rest, ws, rmi, etc.) in order to use (or to be used by) an external service. It's possible! No need to deploy a new application or to restart it.

FraSCAti FScript

To remove an existing SCA binding, you can use the remove-scabinding procedure as following:

FraSCAtiFScript> itf = $domain/scadescendant::converter/scaservice::currencyConverter;
[#<scaservice: converter.currencyConverter>]
FraSCAtiFScript> $itf/scabinding::*
[#<scabinding: converter-ws-skeleton>, #<scabinding: converter-RESTful-skeleton>]
FraSCAtiFScript> wsbinding = $itf/scabinding::converter-ws-skeleton;
[#<scabinding: converter-ws-skeleton>]

FraSCAtiFScript> remove-scabinding($itf,$wsbinding)

FraSCAtiFScript> $itf/scabinding::*
[#<scabinding: converter-RESTful-skeleton>]

The first parameter of the remove-scabinding procedure is the SCA service (or reference) owning the binding and the second one is the binding node previously selected with the help of the scabinding axis.

FraSCAti Explorer

Select an SCA service or reference, then right-click and select the Add SCA binding ... menu item. A new window will be open to let you choose the binding type and fill in binding parameter(s).

The following window will appear:

First, select the tab related to the SCA binding type you want to add. Then fill in parameter(s) with appropriate value(s) and click on the Add Binding button. The binding is now added and up! You can see it on the next screenshot.

If you want to remove an existing SCA binding, select it in the explorer tree, then right-click on it and select the Remove SCA binding menu item. That's all!

Add / Remove an SCA component

FraSCAti allows you to dynamically add SCA components to SCA composites. Adding a component A into composite B does not remove the component A from its previous parent. A is now shared between 2 composites. Removing a component has the same semantic. It just remove the component from the specified composite. The component still exists if it was contained in more than one composite.

FraSCAti FScript

For instance, we can add the client component into the converter composite.

FraSCAtiFScript> $root
#<scacomponent: reconfig>

FraSCAtiFScript> add-scachild($root/scachild::converter, $root/scachild::client)

you can see that the client component is still a child of the reconfig composite but also a child of the converter composite. If you don't want to share it, you can just remove the client component from the reconfig composite.

Warning

All SCA services and references must be unwired/unbound beforere removing a component!

FraSCAtiFScript> remove-scachild($root, $root/scachild::client)

There is a dedicated instruction sca-remove to be able to remove (unload) SCA composites from the SCA domain. This instruction CANNOT works if the argument is not a top level composite contained in the SCA domain.

FraSCAtiFScript> sca-remove("reconfig")

The argument is the name of the composite to remove.

FraSCAti Explorer

Add an SCA component into a composite with FraSCAti Explorer is similar to intents weaving: you just have to drag the component to add and drop it on the SCA composite. To remove a component from an SCA composite, right-click on the component to remove and select Remove component.

Update a component implementation class

Not yet implemented!

FraSCAti FScript


      

FraSCAti Explorer