On Thu, 15 Nov 2001, Gerhard Froehlich wrote: > Stephan, > this's a very good example. Why don't we put parts > of it to the phoenix homepage?
+1 Giacomo > > Cheers > Gerhard > >-----Original Message----- > >From: Stephen McConnell [mailto:[EMAIL PROTECTED] > >Sent: Wednesday, November 14, 2001 11:35 PM > >To: Avalon Developers List > >Subject: RE: Interfaces=Services / dependencies? > > > > > > > >Hans: > > > >A bunch of note in-line. > > > > > >Hans Herbert wrote: > >> I am new at this Mailinglist and hope that my questions are not > >> too stupid. > >[sniped example] > > > >Don't worry - getting the hang of the assembly, manifest and xinfo stuff > >takes a little while. I've snipped out your example and instead I'm > >including an example below of a real .xinfo file and further down an > >extract of an assembly.xml file - together with some comments. > > > >Here is a .xinfo file for a reasonably simple block that serves as a > >factory for business processes the handle PKI certification request. > >I've added comments in line to explain what's going on. > > > > > ><blockinfo> > > > > <block> > > <version>1.0</version> > > </block> > > > > <services> > > > > <!-- > > This block could be declaring several services that it supports. > > Unlike an Java interface, the service includes a version tag. So > > its possible for a block to several services with possibly > > different versions. If there are multiple services then just > > declare them with multiple service entries here. Phoenix will make > > sure that the class with the same name as the .xinfo file > > implements these interfaces (if it doesn't then Phoenix will > > terminate) > > --> > > > > <service name="net.osm.hub.gateway.FactoryService" version="1.0" /> > > > > </services> > > > > <!-- > > So far, we have the definition of a class that supports possibly > > multiple version interface. But things get much more interesting when > > we think about the services that this block requires in order to function > > properly. That's partly handled by the dependencies element and partly by > > the assempbly.xml file (which I'll explain later). I the following > > dependency example there are seven "service" dependencies (i.e. 7 > >versioned > > interface dependencies that must be fulfilled for this block to function. > > --> > > > > <dependencies> > > > > <!-- > > Each dependency contains a declaration of a role name and the > > the service interface and version that can fulfil that role. The > > dependency does not say anything about where that service > > implementation should come from (that's the job the assembly.xml > > file). The role element is simply the label used in the implementation > > of your block configure method that distinguishes a particular > > instance of the service. > > --> > > <dependency> > > <role>GATEWAY</role> > > <service name="net.osm.hub.gateway.GatewayContext" version="1.0"/> > > </dependency> > > > > <!-- > > This dependency declaration simply states that in order to function, > >this > > block requires an a "service" (which happens to a wrapper to a CORBA > > ORB version 2.4) and that the block implementation will lookup that > > service using the "ORB" keyword. > > --> > > <dependency> > > <role>ORB</role> > > <service name="net.osm.hub.gateway.ORBService" version="2.4"/> > > </dependency> > > > > <!-- > > This dependency declares a requirement for a PSS (Persistent State > > Service) Storage Home. > > --> > > <dependency> > > <role>PSS</role> > > <service name="net.osm.hub.gateway.ProcessorStorageHomeService" > >version="1.0"/> > > </dependency> > > > > <!-- > > This dependency enables the block to establish a call-back to the > > block supplying the service. This block uses the Registry interface > > to publish a business process description to a higher level manager. > > --> > > <dependency> > > <role>REGISTRY</role> > > <service name="net.osm.hub.gateway.Registry" version="1.0"/> > > </dependency> > > > > <!-- etc. --> > > <dependency> > > <role>DOMAIN</role> > > <service name="net.osm.hub.gateway.DomainService" version="1.0"/> > > </dependency> > > <dependency> > > <role>RANDOM</role> > > <service name="net.osm.hub.gateway.RandomService" version="1.0"/> > > </dependency> > > <dependency> > > <role>CLOCK</role> > > <service name="net.osm.service.time.TimeService" version="1.0"/> > > </dependency> > > </dependencies> > > > ></blockinfo> > > > >Here is a block declaration I've cut from an assembly.xml file. This enables > >the declaration of WHERE the services are coming from. I.e. you may have a > >system with many blocks and even the potential for matching services > >available > >>from more that one block. The class attribute provides the link to the > >.xinfo > >file and the implementation class. The name is used a key within the > >assembly.xml file when wiring things together. E.g. the provide element > >references a block by its name - and declares that the named block will > >serve > >as the provider of the service. The role attribute matches the role element > >in the .xinfo dependency declaration. > > > > <!-- Certification Request Factory --> > > <block class="net.osm.pki.process.CertificationRequestServer" > >name="certification" > > > <provide name="gateway" role="GATEWAY"/> > > <provide name="gateway" role="ORB"/> > > <provide name="gateway" role="PSS"/> > > <provide name="gateway" role="DOMAIN"/> > > <provide name="gateway" role="RANDOM"/> > > <provide name="pki" role="REGISTRY"/> > > <provide name="time" role="CLOCK"/> > > </block> > > > >> Now the question: Isn't that some kind of double information. I > >> tried some different configuration, but it seems that it has to > >> be that way. > >> - What is the advantage/idea behind this? > > > >First of all it forces structure and separation, secondly, it provides a way > >of managing possibly multiple versions of the same interface in a single > >environment. Thirdly, it enables explicit declaration of the source of > >service provision. For example, in the OSM platform we have multiple blocks > >providing a TimeService. One of those blocks uses an external time > >reference while the others use a local time reference. The local time block > >declare dependencies on the external source time block and periodically > >synchronised. In this example all of the TimeService services are exposing > >the same interface, same version (i.e. same service), but the decision as to > >which service is the provider to another can be explicitly controlled. > >While the time example is perhaps trivial, there are significant policy > >security implications related to service provider selection. > > > >> I found your last answer regarding the BlockListener and "Linking > >> Interfaces to a Block". How can I implement this in my code? > > > >To create a block listener you need to do the following: > > > > 1. declare the listener in the assembly.xml file > > > > <avalon> > > <block-listener name="myListener" class="MyClass" /> > > <!-- > > and any other stuff > > --> > > </avalon> > > > > 2. implement the listener > > > > public class MyClass > > implements BlockListener > > { > > public void blockAdded( BlockEvent event ) > > { > > System.err.printl( "ADDED " + event.getName() ) > > } > > public void blockRemoved( BlockEvent event ) > > { > > System.err.printl( "REMOVED " + event.getName() ) > > } > > } > > > > 3. make sure the listener is included in a jar file in > > the ${SAR-INF}/lib directory. > > > >An I think that about it. > > > >> Let's say, I have a Block that would like to communicate with all > >> the other blocks via interfaces (of course). Either I write all these > >Blocks and > >> interfaces in that above described way OR I say the Block "He, if a Block > >> implements your interface, this Block wants to talk to you. > > > >You could do that but I would recommend using the formal .xinfo/assembly.xml > >approach because (a) are getting much more rigorous about the relationships > >between blocks, and (b) you get lifecycle support, dependency validation, > >and > >things like resource establishment for free courtesy of Phoenix block > >lifecycle > >management. > > > >> So start a lookup at this Block using the componentManager.lookup(ROLE)". > >> - Is it possible to do such a checking during starting up without writing > >> all down in assembly and xinfo? > > > >No. > > > >> This would be a much more flexible way of linking (my opinion) > > > >Absolutely - much more flexible, much easier to put together, and much less > >reliable. :-) > > > >Cheers, Steve. > > > >Stephen J. McConnell, OSM sarl > >digital products for a global economy > >http://www.osm.net > >mailto:[EMAIL PROTECTED] > > > > > > > >-- > >To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> > >For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> > > > > > > > -- > To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> > For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> > > > > -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>