Methods To Integrate Application Components in the Application |
|
The
application may comprise of a collection of components
(e.g. AC). These components may need to communicate
with each other. The communication can involve either
simple data passing or it could involve two or more
components coordinating some activity. Wherein, some
means of connecting the components to each other is
needed. |
|
Usually
the ACs in the web page (or in the application) need
to communicate with each other (e.g. exchange data or
one AC notifies an event to another AC, such as, mouse
clicks, state-change or data arrival.). To accomplish
this the AC must be integrated with other components. |
|
For
example, one or more ACs may be created by CCG (e.g.
CF or GUI-CCG), and their code is copied in to the web-document,
as shown in the fig#1 and Fig#2. Some of the preferred
methods to integrate the ACs in the web-document are
given below. |
|
A.
Using Integration Logic at the server to generated code
to integrate the ACs: |
|
Many
Application components in the applications usually need
to communicate with one or more other ACs or external
code. If Java Classes (e.g. CF or GUI-CCG) generate
the ACs, the ACs need to be integrated, so that, they
can exchange data or communicate with each other. The
following figure illustrates the process to include
the integration code in the web document, which facilitates
inter component communications. |
|
Fig#1 |
|
The
figure#1 shows that a container-CF uses three Java objects
(e.g. CF or GUI-CCG) to generate its subcomponents.
The CF further contain Java code (which is referred
to as Integration-Logic or “IL”), which
interacts with the sub-CCG to get names of service functions
of the ACs or to set callbacks for the ACs; and uses
these functions to generate integration code. Therefore,
the code for the container-AC comprises of the code
for the sub-ACs and their integration code. |
|
Each GUI Component is placed at Proper Location |
|
Arrows
Represent Loosely Coupled Service Interfaces
If the Loosely Coupled Components (e.g. AC01 to AC05) need to collaborate with other,
they Interact with each other by requesting each other services at run-time.
|
New
kind of perfect Loosely Coupled Components
(Click on above to learn about
the Component Making/Packaging)
It requires just 2 lines to include each
CF/AC (Click here for
example). If
any two ACs needs to collaborate with each other, on average they need 3 to 5
more lines of communication code (e.g. to loosely couple service-provider and service-consumer
ACs).
|
|
|
Likewise,
the JSP or Servlet may use one or more CCG-Objects to
include their ACs in the web-document. Furthermore,
the JSP may also generate necessary integration code
and include it in the web-document. |
|
|
Fig#2a(Above)
&
2b(Below)
|
|
Fig#2c(Below) |
|
|
Note:
Upon an event on AC2, the AC2 calls the callback
(Blue-dotter-arrow
in Fig#2b). The callback calls the service method of AC1 (Red-dotter-arrow
in fig#2b)
|
|
The
figure#2 above and listing#1 below shows a simple method
to integrate two ACs that are generated by the CCGs.
The JSP (or container CCG) instantiates and initializes
two CCGs, for example, CCG1 and CCG2. The code uses
their CGM to get the code for the subcomponents AC1
and AC2. It places the code for the subcomponents and
their integration code at appropriate location in its
component code. The following pseudo code illustrates
a sample “integration logic” that generates necessary code for the
two ACs to communicate with each other. |
|
Pseudo-code
listing#1 |
Function CGM( out, req) {
// Code Generation Method for the Container-CCG
// Instantiate and
Initialize the CCG1
CCG1.CGM(Out, req);
// Call Code Generation
Method
// It writes the
code for the AC1-code to OUT stream
// Integration logic to integrate the components.
// Get the name of the AC1’s service method.
String ac1_service_method
= CCG1.getServiceMethodName();
// Generate integration
code. This function calls the service method
of CCG1
Out.println(“ function CB_of_AC2_gets_service_of_AC1
( par1, par2) { “);
Out.println(“ “ + ac1_service_method
+ “(par2);” );
Out.println(“} “);
// Instantiate and
Initialize the CCG2
// Register the callback. Upon given event,
the AC2 calls the callback
CCG2. setCB_AddMethodName(“CB_of_AC2_gets_service_of_AC1”);
// The above
statement makes the CGM to create the Subcomponent
code
// So that, it call the given JavaScript function
upon certain event.
CCG2.CGM(Out, req); //
Call Code Generation Method
// It writes
the code for the AC2-code to OUT stream
} |
|
|
The
pseudo code shows a method to integrate two subcomponents,
such that, one subcomponent AC2 gets a service of the
other subcomponent AC1. To accomplish this, the container-CCG
comprise of code that interact with the CCG-objects
to get necessary data about the subcomponents (i.e.
AC1 and AC2) and to generate the integration code. The
code (referred to as integration logic) calls the service
method of CCG1 to get the name of the service method
of the subcomponent AC1. The integration logic also
generates body of a callback function (e.g. CB_of_AC2_gets_service_of_AC1),
which may be used to call the service method of AC1.
Then the integration logic calls the service method
of CCG2 to register the callback name for the subcomponent
AC2. This statement causes the CCG2 to generate the
AC2 code, such that, the AC2 calls the callback-function
upon the given event (e.g. mouse click) or a change
in the state in the subcomponent AC2. When the callback
function is run, it calls the AC1's service method. |
|
B.
Using Directory services to access services of other
ACs: |
|
The
ACs in the application (or web document) may communicate
by employing publish and subscribe architecture. Refer
to following figure. Publish and subscribe system comprises
of a Registration-Component (or Object) to hold Directory
of services. The name of the Registration-Component
may be reserved word or predefined and its interfaces
(or methods) are published in advance (e.g. documented
and shared with teams at the early stages of the design
of the application). Therefore, the CF or CCG may be
designed to generate its AC’s code, such that,
the AC registers the services that it offer. Likewise,
other AC may also lookup for the services that it needs. |
|
As
shown in the figure#3, each AC in the web document
may register their services with the Registration Component.
To register each service, the AC calls the Registration-Component’s
method to input a lookup-name for the service and reference
to the method (or Object) to get the service. Any AC
in the application may get the service by using the
lookup-name for the service. |
|
For
example, in a simple shopping-cart application where,
upon selection to buy, each shopping-item needs to notify
its data (e.g. its price, model and other data) to the
Invoice/Table component, so that, the item could be
added to the Invoice’s Table. To accomplish this,
the Invoice’s AC could register its service using
a unique service-name (e.g. ShoppingCart); and upon
selection each shopping item’s AC lookup for the
service using the name “ShoppingCart” to
request the service. The service-name (e.g. ShoppingCart)
and data format can be predefined. |
|
Example:
Use of registration class |
|
The
SVG document may have global variables and objects.
It is possible to define a service registration class
(e.g., 'service_register_class') and instantiate a global
object with a reserved name such as 'service_register_obj'.
Now, any AC can access this object using this reserved
name (one version of service registration class is disclosed
in Appendix A). Multiple components or subcomponent
class objects may be registered according to the general
steps shown in FIG. 3. |
|
Fig#3 |
|
The
'service_register_class' can be implemented so that
it supports methods to register services with a service-name.
Also, service can be accessed by methods using the service-name
ID. Using this technique, any component can register
its service with a unique name. If any other component
needs that service, the component can look up the service
using the name. For example, at the beginning of the
SVG document, the service registration object may be
instantiated: |
|
var services_register_obj
= new service_register_class(); |
|
The
CCG object can generate code to register the AC’s
service with the 'service_register_object' using a unique
service-name. For example, the following statement may
be included in the AC’s code to add the AC’s
service: |
|
services_register_obj.add_service("ShoppingCart",
shopping_cart_service); |
|
If
the CCG classes that creates presentation code for the
other ACs know the service-name, they can include the
following instruction in the ACs to get the service: |
|
services_register_obj.get_service("ShoppingCart",
xml_data, callback_name); |
|
Developers
of both client components and server components may
agree on the names of the services in advance or may
use other mechanisms to determine the service-name. (Appendix B comprises of an example) |
|
C.
Accessing Services Of Predefined Utility AC: |
|
The
Application may comprise of one or more global ACs,
whose integration interfaces are predefined (e.g. at
the early stages of the design of the application).
The predefined interfaces may include, the AC’s
names and interfaces of the functions to get its services.
Usually the Global AC provides generic or common services,
such as, status-bar or information-box to display information
or help. Any AC in the application could get their services
to display status, help or information-messages. |
|
For
example, many GUI-applications, such as, Microsoft’s
Internet Explorer or “IE” comprised of “Status
Bar” that displays status and information, such
as, the URL if mouse moves onto a hypertext-link; or
progress, while down loading a web page. |
|
Any
AC in the application may get the services of such utility
ACs, if their names and interfaces defined and documented
in advance (e.g. at the beginning of the application
design). The CCG may be designed to use predefined names
and documented interfaces of the utility ACs, to build
its AC, such that, the AC could get the services. Alternatively
the CCG comprise of methods to input the information,
which may be used to generate the AC, so that, it can
communicate with other ACs. |
|
Appendix-A::
A Simple Service Registrstion Object |
|
Sample
Registration Class code |
//SECTION ONE: Class definition for Register Component
function service_register_class() {
var services_func = new Array(); // An array to save
References to Service-functions or Objects
var services_str =
new Array(); // An array to save Respective Names to lookup the services
// This function
registers or Adds a service and its name.
// The simple
implementation just adds them to respective arrays
this.add_service
= function(name, func) {
services_str[services_str.length]= name;
// Add the Service Name at next Index
services_func[services_func.length] =
func; // Add the Service-Function or Object
}
// This function
searches for the service function for "ser_str"
// If found, it
returns the reference to the service function
this.find_service
= function (ser_str) {
for(i = 0; i
< services_str.length; i++)
if(ser_str ==
services_str[i])
// When found the name
return (services_func[i])
//
Return the reference
return(null)
}
// This function
searches for the service function for "ser_str"
// If found, it
executes the function by passing the parameters.
this.get_service
= function (ser_str, par1, par2, par3) {
for(i = 0; i
< services_str.length; i++) {
if(services_str[i] == ser_str)
return ((services_func[i])(par1, par2, par3))
}
return(null)
}
} // End Of Class
definition
//SECTION TWO: Object Instantiation of Register Object
var service_register_obj = new
service_register_class();
// To add a servise: service_register_obj.add_service("Shopping
Cart1", add_to_invoice);
// To find a service: service_register_obj.find_service("Shopping
Cart1");
|
|
|
Note:
The appendix-B provides an example and appendix-C presentation
a basis for interface contracts between the “loosely
coupled” components in the application. You may
skip them for now and read when you like to learn about
the interface-contracts. |
|
Appendix-B::
Shopping Cart Example for the Application Components |
|
The
shopping cart applications usually contain two types
of components or ACs: |
|
1. |
A
Shopping-cart AC, which is usually an Invoice-table
(see figure#5). It supports one or more services, such
as, a function (or method) to add an item to the Cart
and another function to remove an item from the cart. |
|
2. |
Multiple
AC’s one for each item, one can shop. The shopping-items
may support one or more service methods. For example,
methods such as, a function to register a callback.
If user selects the item to purchase (e.g. by double
clicking on the item), the AC calls the callback and
passes the information about the item in one of the
parameters. This data may be passed in an Object or
an XML-string. The format of the Object or XML-string
is predefined by the Shopping-cart. This information
comprises of data pieces, such as, barcode, model, make,
volume-discounts, inventory and size etc. |
|
The
CF can be designed to hide the manufacturing process
of the AC. The AC may comprise of one or more sub-ACs.
For example, if the items are Cars: it may display a
sub-AC, which shows detailed information about the Car,
when mouse moves onto the AC. Upon one-click, the AC
may display another sub-AC, which contains form GUI-components,
such as, check boxes to select additional options (e.g.
Manual or Auto-transmission and Stereo or CD-player);
and drop down list to select the color. |
|
Furthermore,
the CF may be designed to use the information, such
as, user-profile (e.g. preferred customer), policies
(e.g. inventory clearance), algorithms (e.g. seasonal
dynamics, historical trends, or supply and demand forecast
mismatch) security (e.g. private data to the sales force,
distributors or VARS) and other dynamic business factors.
The CF manufactures the AC. |
|
The
CF, a Java-class, may be independently designed. Likewise,
the CF for the Invoice-table may be designed independently.
The CFs can generate the custom ACs. The code-block
for the ACs can be copied in to the web-document and
integration the ACs (figure#1 and #2), so that the Item’s
callback calls the Shopping-cart’s service method. |
|
The
AC can be integrated using any method, such as, Integration-logic
or Directory-services method. If the components use
Directory-services, the CF may get the name of the service
as one of the inputs as shown in the following pseudo-code,
and generate the ACs to use the name to register or
lookup the service. For example, the Invoice’s
AC may comprise of the code to register its service
using the given name. Likewise, the Item’s AC
may looks-up for the services using the given name. |
|
Pseudo-code listing#10; Sample
Pseudo code for Directory services |
<svg
height="750" width="500">
<g transform="translate(450,10)">
<%
// Instantiate
& Initialize the CF.
AgileTemplate Invoice = new ShoppingCart(“ShoppingCart1”);
// Call the
method to generate the AC’s Code
Invoice.CGM(ati, out);
%>
</g>
<g transform="translate(10, 10)">
// Translate
(X, Y) determines the X & Y location.
<%
//Write
Java Code to use CF to include the AC’s code.
// Instantiate
& Initialize the CF
AgileTemplate Item = new ShoppingItemCar(Model,
“ShoppingCart1”);
// Call the
method to generate the AC’s Code
Item.CGM(ati, out);
%>
</g>
// Likewise,
many shopping items may be included in the web
page.
</svg> |
|
|
Pseudo-code listing#11; Pseudo
code for the Integration Logic |
<svg
height="750" width="500">
<g transform="translate(450,10)">
<%
// Instantiate
& Initialize the CF.
ShoppingCart Invoice = new ShoppingCart();
// Call the
method to generate the AC’s Code
Invoice.CGM(ati, out);
%>
</g>
<script> <![CDATA[
function add_item_to_the_invoice ( barcode,
Item_obj, xml_data) {
// Get the name
of Invoice’s Service method to add an Item. <%=Invoice.getAddItemMethod()%> (barcode,
Item_obj, xml_data);
}
]]>
</script>
<g transform="translate(10, 10)">
// Translate
(X, Y) determines the X & Y location.
<%
//Write Java Code
to use CF to include the AC’s code.
// Instantiate
& Initialize the CF
ShoppingItemCar Item1 = new ShoppingItemCar(Model);
// Register
the callback, which will be called upon selection
to buy.
Item1.addUpOnBuyCallback(“add_item_to_the_invoice”);
// Call the
method to generate the AC’s Code
Item1.CGM(ati, out);
%>
</g>
// Likewise, many
shopping items may be included in the web page.
</svg> |
|
|
Appendix-C::
Interfaces, an example for the data exchange format &
validation |
|
The
ACs usually communicate with each other by calling each
others functions (or methods) and exchange data through
the functions’ parameter and/or functions’
return objects. For successful completion of the communication,
the recipient of the message must know the format of
the message and able to get the minimum necessary data
to successfully complete the task. It is usually desirable
that many large ACs/CFs are designed and build independently
from each other. In such cases, the interfaces are predefined
and documented, so that, the ACs can be designed to
be compatible and properly exchange information after
the integration. |
|
For
example, a shopping cart application comprises of a
shopping-cart and many shopping items. The shopping
cart usually presented by an invoice-table, as shown
in the figure#5. It may support services, such as,
a function to add an item to the Invoice (i.e. add to
the shopping cart) and another function to delete an
item from the shopping-cart. |
|
When
customer selects an item’s AC to purchase the
item, the AC calls the service method to add the item
to the shopping-cart, and passes appropriate data, such
as, barcode or item-id, item’s name, make, model,
price, inventory and volume discounts. This information
may be passed through parameters, such as, data Objects
or in an XML-data string. |
|
The
format of the function parameters and data may be predefined
and documented at the beginning of the design of the
application, so that, each item’s AC can be built
to properly exchange data with the shopping-cart (or
AC for the Invoice). For example, if the shopping-cart’s
AC can accept an XML-string, then each item’s
AC may comprise of the XML-data string and pass the
reference to the string in one of the parameters to
the service function of the Invoice’s AC, to add
the Item to the Shopping-cart upon selection to purchase
the item. |
|
The
AC for each of the shopping-items may be integrated
with the AC for the Invoice to request its services.
For example, the application may comprise of the Integration-logic
code that gets the name of the service methods of the
AC for the shopping-cart. Then the integration logic
generates code for a callback, such that, its body comprises
of the code to set the parameters appropriately and
calls the shopping-cart’s service method. This
callback can be registered with each of the shopping-item. |
|
Fig#5 |
|
The
applications often need to be updated or add new features,
for example, over the time as the business needs change.
To accommodate this newer functionality, the components
(i.e. ACs) must be updated or replaced. Therefore, the
CF need to be redesigned or refined to update the AC.
When components are updated or replaced, proper care
must be taken in order to maintain the communication
interfaces it has with other components (i.e. ACs).
Some times it is required to update the other ACs to
become compatible with the updated interface. |
|
It
is desirable to have tools to detect the broken or mismatches
of the format of the data being exchanged between the
ACs, for example, when a component (i.e. AC) is replaced
or updated. In the preferred embodiment, the recipient
of the data may validate the data format before consuming
the data. To validate the data, the recipient may use
a data format that is designed to accommodate such validations.
Furthermore, the data format may also be extensible,
in order to adapt to evolving business needs. For example,
an XML-schema may be created to define the format of
the data to be exchanged. The XML-data exchanges between
the ACs may be validated against the said XML-schema. |
|
For
example, the service provider (i.e. AC) may define an
XML-schema, which defines vocabulary and pieces of data
needed to process the request for the service. The preferred
embodiment uses a tool to validate the compatibility
of the XML data messages exchanged between any two ACs..
This checking or validation of data messages’
compatibility helps detect some of the hard to find
integration errors. |
|
The
validation tool may be a generic tool that verifies
the compatibility of the XML-messages of the interacting
components. Each component may maintain private copy
and it would update the private XML-schema, when the
XML-message contents are updated. Each of the components
(i.e. AC) is designed to create (or consume) the XML-
data, which is conforms to its private copy. The consumer
component of the XML-message may request the tool to
validate the XML-data. Usually, the XML-data contains
a URI pointing to the private copy of the sender’s
XML-schema. |
|
For
example, the requesting AC may send the request message
(e.g. XML-data) to get a service. Before processing
the request, the service-provider AC may request the
XML-schema validation-tool to validate the XML-message
and requester’s XML-schemas against the service
provider’s XML-schema. If they are not compatible,
it may generate an error message that lists the incompatibilities.
This helps detect some of the data mismatch errors,
for example, if the ACs are inadvertently updated or
replaced. |
|
The
XML-schema usually defines the required data items and
optional data items in the XML-message. Hence, it is
not an error, if the optional data items are not included
in the XML-data string. To accommodate the newer functionality,
the service provider’s XML-schema may be updated.
If optional data fields added to the newer version of
the XML-schema, the service provider may continue to
serve the service requests conforming to the old version
of the XML-schema. If the recipient detects the mismatch
of the XML-formats but the missing fields are optional
data items, and if recipient can process the data without
the information, it may log warning messages and continue
servicing the requests. |
|
Likewise,
the requesting AC (i.e. consumer of the service) may
get an XML-data string in response to its request. It
may also validate the XML-data to detect a broken link
or potential data incompatibility. |
|
To
optimize the performance of the application, this validation
may be turned on only when the application is run in
testing mode. The validation-tool may comprise of a
flag, and supports a mechanism to turn on-or-off the
validation flag. If the flag is turned-off, it immediately
may returns with out performing any validation. |