001    /*
002     * Copyright 2004 Niclas Hedhman.
003     *
004     * Licensed  under the  Apache License,  Version 2.0  (the "License");
005     * you may not use  this file  except in  compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *   http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed  under the  License is distributed on an "AS IS" BASIS,
012     * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
013     * implied.
014     *
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    
019    package net.dpml.transit.monitor;
020    
021    import java.lang.reflect.Constructor;
022    import java.net.URI;
023    import java.net.URL;
024    import java.net.URLClassLoader;
025    
026    /**
027     * Adapts repository service monitor events to a logging channel.
028     *
029     * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
030     * @version 1.0.3
031     */
032    public class RepositoryMonitorAdapter extends AbstractAdapter
033        implements RepositoryMonitor
034    { 
035        // ------------------------------------------------------------------------
036        // constructor
037        // ------------------------------------------------------------------------
038    
039       /**
040        * Creation of a new repository monito to logging adapter.
041        * @param adapter the logging adapter
042        */
043        public RepositoryMonitorAdapter( Adapter adapter )
044        {
045            super( adapter );
046        }
047    
048        // ------------------------------------------------------------------------
049        // RepositoryMonitor
050        // ------------------------------------------------------------------------
051    
052       /**
053        * Handle notification of an information message.
054        * @param info the message
055        */
056        public void sequenceInfo( String info )
057        {
058            if( getAdapter().isDebugEnabled() )
059            {
060                getAdapter().debug( info );
061            }
062        }
063    
064       /**
065        * Handle notification of a request for the establishment of a plugin.
066        * @param parent the parent classloader
067        * @param uri the requested plugin uri
068        * @param args the supplied constructor arguments
069        */
070        public void getPluginRequested( ClassLoader parent, URI uri, Object[] args )
071        {
072            if( getAdapter().isDebugEnabled() )
073            {
074                StringBuffer buffer = new StringBuffer();
075                buffer.append( "loading plugin " );
076                if( args.length == 1 )
077                {
078                    buffer.append( " with a single argument"  );
079                }
080                else if( args.length > 1 )
081                {
082                    buffer.append( " with " + args.length );             
083                    buffer.append( " arguments" );
084                }
085                buffer.append( "\nuri: " + uri.toString() );
086                getAdapter().debug( buffer.toString() );
087            }
088        }
089    
090       /**
091        * Handle notification of the establishment of a plugin class.
092        * @param clazz the plugin class
093        */
094        public void establishedPluginClass( Class clazz )
095        {
096            if( getAdapter().isDebugEnabled() )
097            {
098                StringBuffer buffer = new StringBuffer();
099                buffer.append( "loaded plugin class: " );
100                buffer.append( clazz.getName() );
101                getAdapter().debug( buffer.toString() );
102            }
103        }
104    
105       /**
106        * Handle notification of an exception related to plugin establishment.
107        * @param method the method raising the exception
108        * @param e the causal exception
109        */
110        public void exceptionOccurred( String method, Exception e )
111        {
112            if( getAdapter().isErrorEnabled() )
113            {
114                String error = "Respostory error at : " + method;
115                getAdapter().error( error, e );
116            }
117        }
118    
119       /**
120        * Handle notification of the discovery of a plugin constructor.
121        * @param constructor the constructor
122        * @param args the constructor args
123        */
124        public void pluginConstructorFound( Constructor constructor, Object[] args )
125        {
126            if( getAdapter().isDebugEnabled() )
127            {
128                Class[] classes = constructor.getParameterTypes();
129                if( classes.length == 0 )
130                {
131                    getAdapter().debug( "plugin class contains a null constructor" );
132                }
133                else if( classes.length == 1 )
134                {
135                    getAdapter().debug( 
136                      "plugin class contains a single constructor parameter" );
137                }
138                else
139                {
140                    getAdapter().debug( 
141                      "plugin class contains " 
142                      + classes.length 
143                      + " constructor parameters" );
144                }
145            }
146        }
147    
148       /**
149        * Handle notification of the instantiation of a plugin.
150        * @param plugin the plugin instance
151        */
152        public void pluginInstantiated( Object plugin )
153        {
154            if( getAdapter().isDebugEnabled() )
155            {
156                StringBuffer buffer = new StringBuffer();
157                buffer.append( "plugin: " );
158                buffer.append( plugin.getClass().getName() );
159                buffer.append( "#" );
160                buffer.append( System.identityHashCode( plugin ) );
161                getAdapter().debug( buffer.toString() );
162            }
163        }
164    
165       /**
166        * Handle notification of the creation of a new classloader.
167        * @param type the type of classloader (api, spi or impl)
168        * @param classloader the new classloader 
169        */
170        public void classloaderConstructed( String type, ClassLoader classloader )
171        {
172            if( getAdapter().isDebugEnabled() )
173            {
174                int id = System.identityHashCode( classloader );
175                StringBuffer buffer = new StringBuffer();
176                buffer.append( "created " );
177                buffer.append( type );
178                buffer.append( " classloader: " + id );
179                if( classloader instanceof URLClassLoader )
180                {
181                    URLClassLoader loader = (URLClassLoader) classloader;
182                    URL[] urls = loader.getURLs();
183                    for( int i=0; i < urls.length; i++ )
184                    {
185                        URL url = urls[i];
186                        buffer.append( "\n  [" + i + "] \t" + url.toString() );
187                    }
188                }
189                getAdapter().debug( buffer.toString() );
190            }
191        }
192        
193       /**
194        * Handle notification of system classloader expansion.
195        * @param plugin the uri of the plugin requesting system classloader expansion
196        * @param urls the array of urls added to the system classloader
197        */
198        public void systemExpanded( URI plugin, URL[] urls )
199        {
200            if( getAdapter().isDebugEnabled() )
201            {
202                StringBuffer buffer = new StringBuffer();
203                buffer.append( "system classloader expansion" );
204                buffer.append( "\n  plugin: " + plugin );
205                for( int i=0; i<urls.length; i++ )
206                {
207                    int n = i+1;
208                    buffer.append( "\n  [" + n + "] \t" + urls[i] );
209                }
210                getAdapter().debug( buffer.toString() );
211            }
212        }
213    }