/*
 * Copyright 2004,2005 The Apache Software Foundation.
 * Copyright 2006 International Business Machines Corp.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.axis2.jaxws.message.util.impl;

import org.apache.axis2.jaxws.message.factory.SAAJConverterFactory;
import org.apache.axis2.jaxws.message.util.SAAJConverter;

/**
 * SAAJConverterFactoryImpl
 * Get the default SAAJConverter implementation.
 * Obtain this factory from the FactoryRegistry
 */
public class SAAJConverterFactoryImpl implements SAAJConverterFactory {

	SAAJConverterImpl converter = new SAAJConverterImpl();
	
	/**
	 * Required for Factory instantiation
	 */
	public SAAJConverterFactoryImpl() {
		super();
	}

	/* (non-Javadoc)
	 * @see org.apache.axis2.jaxws.message.factory.SAAJConverterFactory#getSAAJConverter()
	 */
	public SAAJConverter getSAAJConverter() {
		return converter;
	}

}
