001 /** 002 * 003 * Copyright 2004 Protique Ltd 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 * 017 **/ 018 019 package org.activemq.io; 020 import java.io.DataInputStream; 021 import java.io.IOException; 022 023 import javax.jms.JMSException; 024 025 import org.activemq.io.impl.DefaultWireFormat; 026 import org.activemq.util.FactoryFinder; 027 028 /** 029 * Represents a strategy of encoding packets on the wire or on disk using some kind of serialization or wire format. 030 * <p/>We use a default efficient format for Java to Java communication but other formats to other systems can be used, 031 * such as using simple text strings when talking to JavaScript or coming up with other formats for talking to C / C# 032 * languages or proprietary messaging systems we wish to interface with at the wire level etc. 033 * 034 * @version $Revision: 1.1.1.1 $ 035 */ 036 public class WireFormatLoader { 037 private static FactoryFinder finder = new FactoryFinder("META-INF/services/org/activemq/io/"); 038 private WireFormat preferedWireFormat; 039 040 /** 041 * Default Constructor 042 */ 043 public WireFormatLoader() { 044 this(new DefaultWireFormat()); 045 } 046 047 /** 048 * Construct WireFormatLoader with the prefered WireFormat 049 * 050 * @param prefered 051 */ 052 public WireFormatLoader(WireFormat prefered) { 053 this.preferedWireFormat = prefered; 054 } 055 056 /** 057 * Create a wire format 058 * 059 * @param dataIn 060 * @return the WireFormat 061 * @throws JMSException 062 * @throws IOException 063 */ 064 public WireFormat getWireFormat(DataInputStream dataIn) throws JMSException, IOException { 065 WireFormat result = preferedWireFormat; 066 dataIn.mark(10); 067 int protocol = dataIn.read(); 068 if (protocol == 128) { 069 //tis amqfast 070 result = WireFormatLoader.getWireFormat("amqpfast"); 071 } 072 dataIn.reset(); 073 return result; 074 } 075 076 /** 077 * @return Returns the preferedWireFormat. 078 */ 079 public WireFormat getPreferedWireFormat() { 080 return preferedWireFormat; 081 } 082 083 /** 084 * @param preferedWireFormat The preferedWireFormat to set. 085 */ 086 public void setPreferedWireFormat(WireFormat preferedWireFormat) { 087 this.preferedWireFormat = preferedWireFormat; 088 } 089 090 /** 091 * load a WireFormat by name - e.g. 'default','amqpfast' etc. 092 * 093 * @param format 094 * @return the wire format 095 * @throws JMSException 096 */ 097 public static WireFormat getWireFormat(String format) throws JMSException { 098 try { 099 Object value = finder.newInstance(format); 100 if (value instanceof WireFormat) { 101 return (WireFormat) value; 102 } 103 else { 104 throw new JMSException(format + " is not a WireFormat: " + value); 105 } 106 } 107 catch (IllegalAccessException e) { 108 throw createJMSexception(format, e); 109 } 110 catch (InstantiationException e) { 111 throw createJMSexception(format, e); 112 } 113 catch (IOException e) { 114 throw createJMSexception(format, e); 115 } 116 catch (ClassNotFoundException e) { 117 throw createJMSexception(format, e); 118 } 119 } 120 121 protected static JMSException createJMSexception(String protocol, Exception e) { 122 JMSException answer = new JMSException("Could not load protocol: " + protocol + ". Reason: " + e); 123 answer.setLinkedException(e); 124 return answer; 125 } 126 }