/* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. * */ using System; using System.Collections; using Apache.Qpid.Framing; using Apache.Qpid.Messaging; namespace Apache.Qpid.Client.Message { public class MessageFactoryRegistry { private readonly Hashtable _mimeToFactoryMap = new Hashtable(); private IMessageFactory _defaultFactory; /// /// Default factory to use for unknown message types /// public IMessageFactory DefaultFactory { get { return _defaultFactory; } set { _defaultFactory = value; } } /// /// Register a new message factory for a MIME type /// /// Mime type to register /// public void RegisterFactory(string mimeType, IMessageFactory mf) { if ( mf == null ) throw new ArgumentNullException("mf"); if ( mimeType == null || mimeType.Length == 0 ) throw new ArgumentNullException("mimeType"); _mimeToFactoryMap[mimeType] = mf; } /// /// Remove a message factory /// /// MIME type to unregister public void DeregisterFactory(string mimeType) { _mimeToFactoryMap.Remove(mimeType); } /// /// Create a message. This looks up the MIME type from the content header and instantiates the appropriate /// concrete message type. /// /// the AMQ message id /// true if redelivered /// the content header that was received /// a list of ContentBody instances /// the message. /// /// public AbstractQmsMessage CreateMessage(long messageNbr, bool redelivered, ContentHeaderBody contentHeader, IList bodies) { BasicContentHeaderProperties properties = (BasicContentHeaderProperties)contentHeader.Properties; if ( properties.ContentType == null ) { properties.ContentType = ""; } IMessageFactory mf = GetFactory(properties.ContentType); return mf.CreateMessage(messageNbr, redelivered, contentHeader, bodies); } /// /// Create a new message of the specified type /// /// The Mime type /// The new message public AbstractQmsMessage CreateMessage(string mimeType) { if ( mimeType == null || mimeType.Length == 0 ) throw new ArgumentNullException("mimeType"); IMessageFactory mf = GetFactory(mimeType); return mf.CreateMessage(mimeType); } /// /// Construct a new registry with the default message factories registered /// /// a message factory registry public static MessageFactoryRegistry NewDefaultRegistry() { MessageFactoryRegistry mf = new MessageFactoryRegistry(); mf.RegisterFactory("text/plain", new QpidTextMessageFactory()); mf.RegisterFactory("text/xml", new QpidTextMessageFactory()); mf.RegisterFactory("application/octet-stream", new QpidBytesMessageFactory()); mf.DefaultFactory = new QpidBytesMessageFactory(); return mf; } private IMessageFactory GetFactory(string mimeType) { IMessageFactory mf = (IMessageFactory)_mimeToFactoryMap[mimeType]; return mf != null ? mf : _defaultFactory; } } }