001package org.eclipse.aether.internal.impl.slf4j;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 * 
012 *  http://www.apache.org/licenses/LICENSE-2.0
013 * 
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import javax.inject.Inject;
023import javax.inject.Named;
024
025import org.eclipse.aether.spi.locator.Service;
026import org.eclipse.aether.spi.locator.ServiceLocator;
027import org.eclipse.aether.spi.log.Logger;
028import org.eclipse.aether.spi.log.LoggerFactory;
029import org.eclipse.sisu.Nullable;
030import org.slf4j.ILoggerFactory;
031import org.slf4j.spi.LocationAwareLogger;
032
033/**
034 * A logger factory that delegates to <a href="http://www.slf4j.org/" target="_blank">SLF4J</a> logging.
035 */
036@Named( "slf4j" )
037public class Slf4jLoggerFactory
038    implements LoggerFactory, Service
039{
040
041    private static final boolean AVAILABLE;
042
043    static
044    {
045        boolean available;
046        try
047        {
048            Slf4jLoggerFactory.class.getClassLoader().loadClass( "org.slf4j.ILoggerFactory" );
049            available = true;
050        }
051        catch ( Exception e )
052        {
053            available = false;
054        }
055        catch ( LinkageError e )
056        {
057            available = false;
058        }
059        AVAILABLE = available;
060    }
061
062    public static boolean isSlf4jAvailable()
063    {
064        return AVAILABLE;
065    }
066
067    private ILoggerFactory factory;
068
069    /**
070     * Creates an instance of this logger factory.
071     */
072    public Slf4jLoggerFactory()
073    {
074        // enables no-arg constructor
075    }
076
077    @Inject
078    Slf4jLoggerFactory( @Nullable ILoggerFactory factory )
079    {
080        setLoggerFactory( factory );
081    }
082
083    public void initService( ServiceLocator locator )
084    {
085        setLoggerFactory( locator.getService( ILoggerFactory.class ) );
086    }
087
088    public Slf4jLoggerFactory setLoggerFactory( ILoggerFactory factory )
089    {
090        this.factory = factory;
091        return this;
092    }
093
094    public Logger getLogger( String name )
095    {
096        org.slf4j.Logger logger = getFactory().getLogger( name );
097        if ( logger instanceof LocationAwareLogger )
098        {
099            return new Slf4jLoggerEx( (LocationAwareLogger) logger );
100        }
101        return new Slf4jLogger( logger );
102    }
103
104    private ILoggerFactory getFactory()
105    {
106        if ( factory == null )
107        {
108            factory = org.slf4j.LoggerFactory.getILoggerFactory();
109        }
110        return factory;
111    }
112
113    private static final class Slf4jLogger
114        implements Logger
115    {
116
117        private final org.slf4j.Logger logger;
118
119        Slf4jLogger( org.slf4j.Logger logger )
120        {
121            this.logger = logger;
122        }
123
124        public boolean isDebugEnabled()
125        {
126            return logger.isDebugEnabled();
127        }
128
129        public void debug( String msg )
130        {
131            logger.debug( msg );
132        }
133
134        public void debug( String msg, Throwable error )
135        {
136            logger.debug( msg, error );
137        }
138
139        public boolean isWarnEnabled()
140        {
141            return logger.isWarnEnabled();
142        }
143
144        public void warn( String msg )
145        {
146            logger.warn( msg );
147        }
148
149        public void warn( String msg, Throwable error )
150        {
151            logger.warn( msg, error );
152        }
153
154    }
155
156    private static final class Slf4jLoggerEx
157        implements Logger
158    {
159
160        private static final String FQCN = Slf4jLoggerEx.class.getName();
161
162        private final LocationAwareLogger logger;
163
164        Slf4jLoggerEx( LocationAwareLogger logger )
165        {
166            this.logger = logger;
167        }
168
169        public boolean isDebugEnabled()
170        {
171            return logger.isDebugEnabled();
172        }
173
174        public void debug( String msg )
175        {
176            logger.log( null, FQCN, LocationAwareLogger.DEBUG_INT, msg, null, null );
177        }
178
179        public void debug( String msg, Throwable error )
180        {
181            logger.log( null, FQCN, LocationAwareLogger.DEBUG_INT, msg, null, error );
182        }
183
184        public boolean isWarnEnabled()
185        {
186            return logger.isWarnEnabled();
187        }
188
189        public void warn( String msg )
190        {
191            logger.log( null, FQCN, LocationAwareLogger.WARN_INT, msg, null, null );
192        }
193
194        public void warn( String msg, Throwable error )
195        {
196            logger.log( null, FQCN, LocationAwareLogger.WARN_INT, msg, null, error );
197        }
198
199    }
200
201}