/*
 * JMSTopicTargetFactory.java
 *
 * Created on August 26, 2001, 5:17 PM
 */

package org.apache.avalon.excalibur.logger.factory;

import org.apache.avalon.excalibur.logger.LogTargetFactory;

import org.apache.log.LogTarget;
import org.apache.log.output.jms.JMSTopicTarget;
import org.apache.log.output.jms.MessageBuilder;
import org.apache.log.output.jms.ObjectMessageBuilder;
import org.apache.log.output.jms.TextMessageBuilder;

import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.ConfigurationException;

import javax.jms.TopicConnectionFactory;
import javax.jms.Topic;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;


/**
 * Factory for JMSTopicTarget-s. The configuration looks like this:
 *
 * <pre>
 * &lt;jms id="topic"&gt;
 *     &lt;connection-factory&gt;java:/TopicConectionFactory&lt;/connection-factory&gt;
 *     &lt;topic&gt;jms/LogTopic&lt;/topic&gt;
 *     &lt;message persistent="false"&gt;text&lt;/message&gt;
 * &lt;/jms&gt;
 * </pre>
 *
 * @author <a href="mailto:mirceatoma@home.com">Mircea Toma</a>;
 * @version CVS $Revision$ $Date$
 */
public class JMSTopicTargetFactory implements LogTargetFactory 
{

    public LogTarget createTarget(Configuration configuration) throws ConfigurationException    
    {
        final String factoryName =
            configuration.getChild("connection-factory", true).getValue();

        final String topicName =
            configuration.getChild("topic", true).getValue();
        
        final String messageType =
            configuration.getChild("message", true).getValue("text");
        
        
        final TopicConnectionFactory factory;
        final Topic topic;
        final MessageBuilder messageBuilder;
        
        try
        {
            Context ctx = new InitialContext();
            factory = (TopicConnectionFactory) ctx.lookup(factoryName);
            topic = (Topic) ctx.lookup(topicName);
        }
        catch (NameNotFoundException nnfe)
        {
            throw new ConfigurationException("Cannot lookup object", nnfe);
        }
        catch (NamingException ne)
        {
            throw new ConfigurationException("Cannot get naming context", ne);
        }
     
        if ( "object".equals(messageType) )
        {
            messageBuilder = new ObjectMessageBuilder();
        }
        else 
        {
            messageBuilder = new TextMessageBuilder();
        }
        
        return new JMSTopicTarget(messageBuilder , factory, topic);
    }
    
}
