Thansk a lot for many good answers to my question. In order to log the answer to this question, let me summarize what I found.
The block.xml (see in the bottom) has only one component activation="startup" which makes it a good candidate for main entry of an application. > > <component name="IMServer" > > class="net.java.dev.openim.IMServerImpl" activation="startup"/> I understand that several components may have activation="startup", but the sequence of the startup is resolved based on the dependencies of various components. I assume that the developer (assembler) should make sure that only one component to get the virtual sequence number "1", but again I am thinking very traditional. Furthermore, the source code of net.java.dev.openim.IMServerImpl (see below) has an "initialize" method that indicates to be a good candidate for a main entry of the application. Best Regards -- Nader Aeinehchi Aasenhagen 66 E 2020 Skedsmokorset NORWAY Direct and Mobile +47 41 44 29 57 Tel (private): +47 64 83 09 08 Fax +47 64 83 08 07 www.aeinehchi.com /* * BSD License http://open-im.net/bsd-license.html * Copyright (c) 2003, OpenIM Project http://open-im.net * All rights reserved. * * This software consists of voluntary contributions made by many * individuals on behalf of the OpenIM project. For more * information on the OpenIM project, please see * http://open-im.net/ */ package net.java.dev.openim; import java.net.InetAddress; import java.net.ServerSocket; import org.apache.avalon.cornerstone.services.connection.ConnectionHandler; import org.apache.avalon.cornerstone.services.connection.ConnectionHandlerFactory; import org.apache.avalon.cornerstone.services.connection.ConnectionManager; import org.apache.avalon.cornerstone.services.sockets.ServerSocketFactory; import org.apache.avalon.cornerstone.services.sockets.SocketManager; import org.apache.avalon.framework.activity.Initializable; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.service.Serviceable; import org.apache.avalon.framework.service.ServiceManager; /** * @avalon.component version="1.0" name="net.java.dev.openim.IMServer" lifestyle="transient" * @avalon.service type="net.java.dev.openim.IMServer" * * @version 1.0 * @author AlAg */ public class IMServerImpl extends AbstractLogEnabled implements IMServer, Configurable, Initializable, ConnectionHandlerFactory, Serviceable { private ServerParameters m_serverParameters; private ServiceManager m_serviceManager; private SocketManager m_socketManager; private ConnectionManager m_connectionManager; private int m_listenBacklog; private InetAddress m_bindTo; //------------------------------------------------------------------------- public void configure(org.apache.avalon.framework.configuration.Configuration configuration) throws org.apache.avalon.framework.configuration.ConfigurationException { m_listenBacklog = configuration.getChild( "listen-backlog" ).getValueAsInteger(); final String bindAddress = configuration.getChild( "bind" ).getValue( null ); try{ if( bindAddress != null ){ m_bindTo = InetAddress.getByName( bindAddress ); } } catch( java.net.UnknownHostException e ){ throw new ConfigurationException( "Unable to bind " + bindAddress, e ); } } //------------------------------------------------------------------------- /** * @avalon.dependency type="net.java.dev.openim.ServerParameters:1.0" key="ServerParameters" * * @avalon.dependency type="net.java.dev.openim.IMConnectionHandler:1.0" key="IMConnectionHandler" * @avalon.dependency type="org.apache.avalon.cornerstone.services.conne ction.ConnectionManager" key="ConnectionManager" * @avalon.dependency type="org.apache.avalon.cornerstone.services.sockets.SocketManager" key="SocketManager" */ public void service(ServiceManager serviceManager) throws org.apache.avalon.framework.service.ServiceException { m_serviceManager = serviceManager; m_socketManager = (SocketManager)serviceManager.lookup( "SocketManager" ); m_connectionManager = (ConnectionManager)serviceManager.lookup( "ConnectionManager" ); m_serverParameters = (ServerParameters)serviceManager.lookup( "ServerParameters" ); } //------------------------------------------------------------------------- public void initialize() throws java.lang.Exception { final ServerSocketFactory factory = m_socketManager.getServerSocketFactory( "plain" ); final ServerSocket clientServerSocket = factory.createServerSocket( m_serverParameters.getLocalClientPort(), m_listenBacklog, m_bindTo ); final ServerSocket serverServerSocket = factory.createServerSocket( m_serverParameters.getLocalServerPort(), m_listenBacklog, m_bindTo ); m_connectionManager.connect( "client-listener", clientServerSocket, this ); m_connectionManager.connect( "server-listener", serverServerSocket, this ); final ServerSocketFactory sslfactory = m_socketManager.getServerSocketFactory( "secure" ); final ServerSocket sslClientServerSocket = sslfactory.createServerSocket( m_serverParameters.getLocalSSLClientPort(), m_listenBacklog, m_bindTo ); final ServerSocket sslServerServerSocket = sslfactory.createServerSocket( m_serverParameters.getLocalSSLServerPort(), m_listenBacklog, m_bindTo ); m_connectionManager.connect( "ssl-client-listener", sslClientServerSocket, this ); m_connectionManager.connect( "ssl-server-listener", sslServerServerSocket, this ); String s = "Server '"+ m_serverParameters.getHostName()+"' initialized on" + " server2server port " + m_serverParameters.getLocalServerPort() + " SSL-server2server port " + m_serverParameters.getLocalSSLServerPort() + " client2server port " + m_serverParameters.getLocalClientPort() + " SSL-client2server port " + m_serverParameters.getLocalSSLClientPort(); getLogger().info( s ); //System.out.println( s ); } //------------------------------------------------------------------------- public ConnectionHandler createConnectionHandler() throws java.lang.Exception { return (ConnectionHandler)m_serviceManager.lookup( "IMConnectionHandler" ); } //------------------------------------------------------------------------- public void releaseConnectionHandler(ConnectionHandler connectionHandler) { //m_serviceManager.release( connectionHandler ); } //------------------------------------------------------------------------- } ----- Original Message ----- From: "Olaf Bergner" <[EMAIL PROTECTED]> To: "Avalon framework users" <[EMAIL PROTECTED]> Sent: Friday, April 09, 2004 8:24 PM Subject: RE: Entry point in block.xml in Merlin > If I understand your problem correctly you are disturbed as to what is > Merlin's equivalent of the main method. While it is correct that the > activation flag tells Merlin when to deploy a component it's got nothing to > do with determining the entry point of a whole application. This is indeed > something to confuse the uninitiated. I think you are looking for a > component implementing the org.apache.avalon.framework.activity.Startable or > the org.apache.avalon.framework.activity.Executable interface. IIRC the > contract surrounding these interfaces states that Startable's start() resp. > Executable's execute() method will be called immediately after deploying the > component. These methods are meant to start resp. execute a component and > thus probably come closest to what you are looking for. To make it very > clear: you won't find what you are looking for in any block.xml or other > config file. This knowledge is implicit in the source code, not explicit in > some config file. > > That being said it seems - after a rather quick and casual glance at the > source for OpenIM - that in this case the whole thing starts in > net.java.dev.openim.IMServerImpl's initialize() method where the necessary > server sockets are created and bound to the IMServer. I think this is not > the pure gospel, but then again I don't know that much about the Avalon > framework. > > So returning to your question: the Avalon framework defines a well-known > lifecycle for components, i.e. it states which methods defined in its > lifecycle interfaces are called in which order. So if you want to start your > application you've got to utilize this knowledge and put your start logic in > an appropriate method in one of your components of which you are certain > that it will be called by the container. I think start() in Startable resp. > execute() in Executable are meant for this purpose but I have found that > people tend to rather use initialize() in Initializable. > > Hope this answers your question. > > Cheers, > > Olaf > > > -----Original Message----- > > From: Nader Aeinehchi [mailto:[EMAIL PROTECTED] > > Sent: Friday, April 09, 2004 2:11 PM > > To: [EMAIL PROTECTED] > > Subject: Entry point in block.xml in Merlin > > > > > > Hi > > > > I am trying to understand what the entry point in a block.xml is. > > > > For example, I looket at OpenIM that is built upon Merlin. OpenIM > > is launched with: > > > > merlin .... openim\jars\openim-server-impl-1.2.jar > > > > Now when I look at the block.xml filen within the above jar file, > > I find lots of component definition, but I cannot see which > > component is launched first. > > > > Please help. > > > > Thanks. > > > > > > See the enclosed block.xml from openim. > > > > Best Regards > > > > -- > > Nader Aeinehchi > > Aasenhagen 66 E > > 2020 Skedsmokorset > > NORWAY > > Direct and Mobile +47 41 44 29 57 > > Tel (private): +47 64 83 09 08 > > Fax +47 64 83 08 07 > > www.aeinehchi.com > > > > > > > > <container name="openim"> > > > > <services> > > <service type="net.java.dev.openim.SimpleMessageRouter"> > > <source>SimpleMessageRouter</source> > > </service> > > </services> > > > > <categories> > > <category name="threads/classloader/scanner" priority="ERROR"/> > > </categories> > > > > <!-- > > Block implementation. > > --> > > <classloader> > > <classpath> > > <repository> > > <!-- OpenIM --> > > <resource id="openim:openim-server-api" version="1.2"/> > > <resource id="openim:openim-storage-api" version="1.2"/> > > <resource id="openim:openim-storage-impl" version="1.2"/> > > <resource id="openim:openim-users-manager-api" version="1.3"/> > > <resource id="openim:openim-users-manager-impl" version="1.3"/> > > > > <!-- XPP --> > > <resource id="kxml2:kxml2" version="2.1.8"/> > > > > <!-- Commons --> > > <resource id="commons-lang:commons-lang" version="1.0.1"/> > > <resource id="commons-collections:commons-collections" > > version="2.1"/> > > > > <!-- Avalon --> > > <resource id="avalon-framework:avalon-framework-api" > > version="4.1.5"/> > > <resource id="avalon-framework:avalon-framework-impl" > > version="4.1.5"/> > > > > <!-- Cornerstone --> > > <resource > > id="cornerstone-threads:cornerstone-threads-api" version="1.0"/> > > > > <resource > > id="cornerstone-sockets:cornerstone-sockets-api" version="1.0"/> > > > > <resource > > id="cornerstone-connection:cornerstone-connection-api" version="1.0"/> > > <resource > > id="cornerstone-connection:cornerstone-connection-impl" version="1.0"/> > > > > <resource > > id="cornerstone-scheduler:cornerstone-scheduler-api" version="1.0"/> > > > > <resource > > id="cornerstone-datasources:cornerstone-datasources-api" version="1.0"/> > > > > <!-- Excalibur --> > > <resource id="excalibur-pool:excalibur-pool" version="1.2"/> > > <resource id="excalibur-thread:excalibur-thread" > > version="1.1.1"/> > > <resource id="excalibur:excalibur-collections" version="1.0"/> > > <resource id="excalibur:excalibur-io" version="1.1"/> > > <resource > > id="excalibur-concurrent:excalibur-concurrent" version="1.0"/> > > > > <!-- XStream --> > > <resource id="xstream:xstream" version="0.3"/> > > > > </repository> > > </classpath> > > </classloader> > > > > > > <include name="threads" > > id="cornerstone-threads:cornerstone-threads-impl" > > version="1.0"/> > > > > <include name="sockets" > > id="cornerstone-sockets:cornerstone-sockets-impl" > > version="1.0"> > > <target path="manager"> > > <configuration> > > <server-sockets> > > <factory name="plain" > > > > class="org.apache.avalon.cornerstone.blocks.sockets.DefaultServerS > > ocketFactory"/> > > <factory name="secure" > > > > class="org.apache.avalon.cornerstone.blocks.sockets.TLSServerSocke > > tFactory" > > > <ssl-factory> > > <keystore> > > <file>conf/keystore</file> <!-- keystore > > file location --> > > <password>openim</password> <!-- Key Store > > file password, only used to check keystore integrity --> > > <key-password>openim</key-password> <!-- > > Only required when you need to decrypt a private key --> > > <type>JKS</type> <!-- Key Store file > > format, defaults to JKS --> > > <algorithm>SunX509</algorithm> <!-- > > Cryptography provider ID, defaults to SunX509 --> > > </keystore> > > > > <!-- SSL protocol to use, defaults to TLS, > > another possible value is SSL --> > > <protocol>TLS</protocol> > > > > </ssl-factory> > > > > <timeout>0</timeout> > > <!-- With this option set to a non-zero > > timeout, a call to > > accept() for this ServerSocket will block > > for only this amount of > > time. If the timeout expires, a > > java.io.InterruptedIOException is > > raised, though the ServerSocket is still > > valid. Default value is 0. --> > > <authenticate-client>false</authenticate-client> > > <!-- Whether or not the client must present a > > certificate to > > confirm its identity. Defaults to false. --> > > </factory> > > </server-sockets> > > > > <client-sockets> > > <factory name="plain" > > > > class="org.apache.avalon.cornerstone.blocks.sockets.DefaultSocketF > > actory"/> > > </client-sockets> > > </configuration> > > </target> > > </include> > > > > <include name="scheduler" > > id="cornerstone-scheduler:cornerstone-scheduler-impl" > > version="1.0"/> > > > > <include name="datasources" > > id="cornerstone-datasources:cornerstone-datasources-impl" > > version="1.0"/> > > > > > > <include name="storage" > > id="openim:openim-storage-impl" version="1.2"/> > > > > <include name="users-manager" > > id="openim:openim-users-manager-impl" version="1.3"/> > > > > > > > > > > <component name="IMServer" > > class="net.java.dev.openim.IMServerImpl" activation="startup"/> > > <component name="ServerParameters" > > class="net.java.dev.openim.ServerParametersImpl" activation="lazy"/> > > <component name="IMConnectionHandler" > > class="net.java.dev.openim.IMConnectionHandlerImpl" activation="lazy"/> > > <component name="IMPresenceHolder" > > class="net.java.dev.openim.IMPresenceHolderImpl" activation="lazy"/> > > <component name="IMRouter" > > class="net.java.dev.openim.IMRouterImpl" activation="lazy"/> > > <component name="S2SConnectorManager" > > class="net.java.dev.openim.S2SConnectorManagerImpl" activation="lazy"/> > > <component name="S2SConnector" > > class="net.java.dev.openim.S2SConnectorImpl" activation="lazy"/> > > <component name="SubscriptionManager" > > class="net.java.dev.openim.SubscriptionManagerImpl" activation="lazy"/> > > <component name="ModuleManager" > > class="net.java.dev.openim.ModuleManagerImpl" activation="lazy"/> > > <component name="SimpleMessageRouter" > > class="net.java.dev.openim.SimpleMessageRouterImpl" activation="lazy"/> > > > > <component name="SessionsManager" > > class="net.java.dev.openim.session.SessionsManagerImpl" > > activation="lazy"/> > > <component name="IMClientSession" > > class="net.java.dev.openim.session.IMClientSessionImpl" > > activation="lazy"/> > > <component name="IMServerSession" > > class="net.java.dev.openim.session.IMServerSessionImpl" > > activation="lazy"/> > > > > <component name="User" > > class="net.java.dev.openim.data.jabber.UserImpl" activation="lazy"/> > > <component name="UsersManager" > > class="net.java.dev.openim.data.UsersManagerImpl" activation="lazy"/> > > > > <component name="Streams" > > class="net.java.dev.openim.jabber.StreamsImpl" activation="lazy"/> > > <component name="Error" > > class="net.java.dev.openim.jabber.ErrorImpl" activation="lazy"/> > > > > <component name="client.Body" > > class="net.java.dev.openim.jabber.client.BodyImpl" activation="lazy"/> > > <component name="client.Iq" > > class="net.java.dev.openim.jabber.client.IqImpl" activation="lazy"/> > > <component name="client.Message" > > class="net.java.dev.openim.jabber.client.MessageImpl" activation="lazy"/> > > <component name="client.Presence" > > class="net.java.dev.openim.jabber.client.PresenceImpl" activation="lazy"/> > > <component name="client.Priority" > > class="net.java.dev.openim.jabber.client.PriorityImpl" activation="lazy"/> > > <component name="client.Show" > > class="net.java.dev.openim.jabber.client.ShowImpl" activation="lazy"/> > > <component name="client.Status" > > class="net.java.dev.openim.jabber.client.StatusImpl" activation="lazy"/> > > <component name="client.Subject" > > class="net.java.dev.openim.jabber.client.SubjectImpl" activation="lazy"/> > > <component name="client.Thread" > > class="net.java.dev.openim.jabber.client.ThreadImpl" activation="lazy"/> > > > > <component name="iq.auth.Digest" > > class="net.java.dev.openim.jabber.iq.auth.DigestImpl" activation="lazy"/> > > <component name="iq.auth.Password" > > class="net.java.dev.openim.jabber.iq.auth.PasswordImpl" > > activation="lazy"/> > > <component name="iq.auth.Query" > > class="net.java.dev.openim.jabber.iq.auth.QueryImpl" activation="lazy"/> > > <component name="iq.auth.Resource" > > class="net.java.dev.openim.jabber.iq.auth.ResourceImpl" > > activation="lazy"/> > > <component name="iq.auth.Username" > > class="net.java.dev.openim.jabber.iq.auth.UsernameImpl" > > activation="lazy"/> > > > > <component name="iq.browse.Query" > > class="net.java.dev.openim.jabber.iq.browse.QueryImpl" activation="lazy"/> > > > > <component name="iq.search.Query" > > class="net.java.dev.openim.jabber.iq.search.QueryImpl" activation="lazy"/> > > > > <component name="iq.oob.Query" > > class="net.java.dev.openim.jabber.iq.oob.QueryImpl" activation="lazy"/> > > > > <component name="iq.jprivate.Query" > > class="net.java.dev.openim.jabber.iq.jprivate.QueryImpl" > > activation="lazy"/> > > > > <component name="iq.register.Password" > > class="net.java.dev.openim.jabber.iq.register.PasswordImpl" > > activation="lazy"/> > > <component name="iq.register.Query" > > class="net.java.dev.openim.jabber.iq.register.QueryImpl" > > activation="lazy"/> > > <component name="iq.register.Username" > > class="net.java.dev.openim.jabber.iq.register.UsernameImpl" > > activation="lazy"/> > > <component name="iq.register.Remove" > > class="net.java.dev.openim.jabber.iq.register.RemoveImpl" > > activation="lazy"/> > > > > <component name="iq.roster.Group" > > class="net.java.dev.openim.jabber.iq.roster.GroupImpl" activation="lazy"/> > > <component name="iq.roster.Item" > > class="net.java.dev.openim.jabber.iq.roster.ItemImpl" activation="lazy"/> > > <component name="iq.roster.Query" > > class="net.java.dev.openim.jabber.iq.roster.QueryImpl" activation="lazy"/> > > > > <component name="iq.vcardtemp.VCard" > > class="net.java.dev.openim.jabber.iq.vcardtemp.VCardImpl" > > activation="lazy"/> > > > > <component name="server.Body" > > class="net.java.dev.openim.jabber.server.BodyImpl" activation="lazy"/> > > <component name="server.Error" > > class="net.java.dev.openim.jabber.server.ErrorImpl" activation="lazy"/> > > <component name="server.Iq" > > class="net.java.dev.openim.jabber.server.IqImpl" activation="lazy"/> > > <component name="server.Message" > > class="net.java.dev.openim.jabber.server.MessageImpl" activation="lazy"/> > > <component name="server.Presence" > > class="net.java.dev.openim.jabber.server.PresenceImpl" activation="lazy"/> > > <component name="server.Priority" > > class="net.java.dev.openim.jabber.server.PriorityImpl" activation="lazy"/> > > <component name="server.Show" > > class="net.java.dev.openim.jabber.server.ShowImpl" activation="lazy"/> > > <component name="server.Status" > > class="net.java.dev.openim.jabber.server.StatusImpl" activation="lazy"/> > > <component name="server.Subject" > > class="net.java.dev.openim.jabber.server.SubjectImpl" activation="lazy"/> > > <component name="server.Thread" > > class="net.java.dev.openim.jabber.server.ThreadImpl" activation="lazy"/> > > > > <component name="server.dialback.Result" > > class="net.java.dev.openim.jabber.server.dialback.ResultImpl" > > activation="lazy"/> > > <component name="server.dialback.Verify" > > class="net.java.dev.openim.jabber.server.dialback.VerifyImpl" > > activation="lazy"/> > > > > <component name="MessageLogger" > > class="net.java.dev.openim.log.MessageLoggerImpl" activation="lazy"/> > > <component name="MessageRecorder" > > class="net.java.dev.openim.log.MessageRecorderImpl" activation="lazy"/> > > > > </container> > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
